当前位置: 首页 > news >正文

设计模式——代理模式

 导航: 

【黑马Java笔记+踩坑汇总】JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud+黑马旅游+谷粒商城+学成在线+设计模式+牛客面试题

目录

1、代理模式的基本介绍

2、静态代理

3、JDK动态代理

4、Cglib 代理

5、代理模式 的变体(应用场景)


1、代理模式的基本介绍

代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象

代理模式是结构型设计模式(用于描述对象之间的组合关系)。

好处:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能

被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象(代理时对目标对象进行安全控制)

我们并不希望客户端直接调用目标对象,而是通过代理对象对目标对象实现安全控制或增强功能。所以我们客户端直接依赖代理对象,代理对象依赖目标对象:

代理模式有不同的形式,主要有三种:静态代理、JDK动态代理、Cglib 代理

静态代理:

目标对象与代理对象实现租同的接口或继承相同的父类,在编译时生成代理对象。

目标对象实现代理接口,代理对象实现并聚合代理接口,重写方法编写增强后逻辑。

JDK动态代理:

通过Java反射机制在运行时动态地在内存中生成代理对象。 目标对象需要实现代理接口。

目标对象实现代理接口,代理工厂通过Proxy类的静态方法newProxyInstance(),利用反射机制返回代理对象实例。  

newProxyInstance()三个参数:目标对象的类加载器、目标对象的接口、实现InvocationHandler接口并重写invoke()方法,编写代理对象逻辑。

应用:Spring AOP采用了动态代理的方式,在运行时动态的创建代理对象来实现增强。

Cglib 代理:

内存中构建一个子类对象从而实现对目标对象功能扩展。目标对象不需要实现代理接口。底层是通过使用ASM框架转换字节码并生成新的类。

代理工厂类实现MethodInterceptor接口并重写intercept()方法编写代理逻辑,通过cglib包的Enhancer类设置父类字节码文件和创建子类对象来返回代理对象实例。

ASM框架是一个强大的Java字节码操作框架,可以让程序员通过代码生成和转换现有字节码来操作Java类。ASM可以直接生成字节码,也可以通过访问现有字节码来修改它。

 

2、静态代理

静态代理在使里时,需要定义接口或者父类,目标对象与代理对象实现租同的接口或继承相同的父类

实现方式:目标对象实现代理接口,代理对象实现并聚合代理接口,重写方法编写增强后逻辑。

优缺点

  • 优点:在不修改目标对象的功能前提下,能通过代理对象对目标功能扩展
  • 缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类。耦合性较高,一旦接口增加方法,目标对象与代理对象都要维护

 

案例

  • 1)定义一个接口:ITeacherDao
  • 2)目标对象TeacherDao实现接口ITeacherDao
  • 3)使用静态代理方式,就需要在代理对象TeacherDaoProxy中也实现ITeacherDao
  • 4)调用的时候通过调用代理对象的方法来调用目标对象
  • 5)特别提醒:代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法

UML 类图

 

  核心代码

/*** 代理接口*/
public interface ITeacherDao {void teach();    //代理对象和原始对象重写这个方法
}
/*** 目标对象,即被代理对象。实现代理借口*/
public class TeacherDao implements ITeacherDao {@Overridepublic void teach() {System.out.println("老师授课中...");}
}
/*** 代理对象。实现代理借口*/
public class TeacherDaoProxy implements ITeacherDao {private ITeacherDao iTeacherDao;    //接口引用public TeacherDaoProxy(ITeacherDao iTeacherDao) {this.iTeacherDao = iTeacherDao;}@Overridepublic void teach() {System.out.println("准备授课...");iTeacherDao.teach();System.out.println("结束授课...");}
}

客户端调用代理

//创建被代理对象
TeacherDao teacherDao = new TeacherDao();
//创建代理对象,聚合被代理对象
TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);
//通过代理对象,调用被代理对象的方法
teacherDaoProxy.teach();

3、JDK动态代理

Java中的动态代理是一种机制,它通过在程序运行时动态地生成代理对象,并在代理对象上进行方法调用,实现对目标对象方法的拦截与控制。动态代理是代理设计模式的一种实现方式,与静态代理不同的是,它不需要显示地编写代理类来代理被代理对象,而是通过Java反射机制在运行时动态生成代理类和代理对象。 

实现方法:

目标对象实现代理接口,代理工厂通过Proxy类的静态方法newProxyInstance(),利用反射机制返回代理对象实例。  

newProxyInstance()三个参数:目标对象的类加载器、目标对象的接口、实现InvocationHandler接口并重写invoke()方法,编写代理对象逻辑。

  • 1)代理对象不需要实现接口,但是目标对象要实现接口,否则不能用动态代理
  • 2)代理对象的生成,是利用 JDK 的 APl,动态的在内存中构建代理对象
  • 3)动态代理也叫做:JDK 代理、接口代理

 JDK提供了java.lang.reflect.Proxy类,可以通过它创建基于接口的动态代理对象。使用Proxy类的newProxyInstance静态方法,该方法需要接收三个参数:

static Object newProxylnstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

案例: 

 核心代码

//代理接口和目标对象同上,目标对象需要实现代理接口
// ITeacherDao与TeacherDao同上
/*** 代理工厂*/
public class TeacherFactory {/*** 目标对象*/private Object target;public TeacherFactory(Object target) {this.target = target;}public Object newProxyInstance() {
//1。ClassLoader loader : 指定当前目标对象使用的类加载器,获取加载器的方法固定
//2,Class<?>[] interfaces: 目标对象实现的接口类型,使用泛型方法确认类型
//3。InvocationHandler h : 事情处理,执行目标对象的方法时,会触发事情处理器方法,会把当前执行的目标对象方法作为参数传入return Proxy.newProxyInstance(target.getClass().getClassLoader(), 
target.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("JDK代理授课开始...");Object returnVal = method.invoke(target, args);System.out.println("JDK代理授课结束...");return returnVal;}});}
}

创建代理对象:

//创建目标对象
ITeacherDao target = new TeacherDao();
//给目标对象,创建代理对象,可以转成 ITeacherDao
ITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(target).getProxyInstance();
// proxyInstance=class com.sun.proxy.$Proxy0 内存中动态生成了代理对象
System.out.println("proxyInstance=" + proxyInstance.getClass());
//通过代理对象,调用目标对象的方法
proxyInstance.teach();

其中几个参数

  • 1)ClassLoader loader:指定当前目标对象使用的类加载器,获取加载器的方法固定
  • 2)Class<?>[] interfaces:目标对象实现的接口类型,使用泛型方法确认类型
  • 3)InvocationHandler h:事情处理,执行目标对象的方法时触发事情处理器方法,把当前执行的目标对象方法作为参数传入

4、Cglib 代理

Cglib 代理

静态 代理和 JDK 代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理——这就是 Cglib 代理

Cglib 代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展,有些书也将 Cglib 代理归属到动态代理。

使用方法:

代理工厂类实现MethodInterceptor接口并重写intercept()方法编写代理逻辑,通过cglib包的Enhancer类设置父类字节码文件和创建子类对象来返回代理对象实例。

Cglib包

是一个强大的高性能的代码生成包,它可以在运行期扩展 java 类与实现 java 接口。它广泛的被许多 AOP 的框架使用,例如 Spring AOP,实现方法拦截。

Cglib 包的底层是通过使用ASM框架转换字节码并生成新的类

ASM框架

一个强大的Java字节码操作框架,可以让程序员通过代码生成和转换现有字节码来操作Java类。ASM可以直接生成字节码,也可以通过访问现有字节码来修改它。我们可以使用ASM来生成新的类、新的方法、字段、注解等。同时,ASM还允许我们在运行时改变现有的Java类的字节码,从而实现动态的Java类修改,例如添加方法、添加字段等。

在 AOP 编程中如何选择代理模式:

  • 目标对象需要实现接口,用 JDK 代理
  •  目标对象不需要实现接口,用 Cglib 代理

案例:

  • 1)引入cglib的 jar 文件

  • 2)在内存中动态构建子类,注意代理的类不能为final,否则报错java.lang.IllegalArgumentException
  • 3)目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法

uml图,不再有代理接口
  


核心代码
 

/*** 被代理对象*/
public class TeacherDao {public String teach() {System.out.println("老师授课中...");return "Good";}
}/*** 代理工厂类,实现MethodInterceptor 接口*/
public class ProxyFactory implements MethodInterceptor {/*** 目标对象*/private Object target;/*** 构造函数** @param target*/public ProxyFactory(Object target) {this.target = target;}/*** 返回代理对象实例。不是静态方法** @return*/public Object getProxyInstance() {// 1、创建工具类Enhancer enhancer = new Enhancer();// 2、设置父类enhancer.setSuperclass(target.getClass());// 3、设置回调函数enhancer.setCallback(this);// 4、创建子类对象,即代理对象return enhancer.create();}@Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("cglib代理开始...");Object retVal = method.invoke(target, args);System.out.println("cglib代理结束...");return retVal;}
}

 调用代理

//创建目标对象
TeacherDao teacherDao = new TeacherDao();
//通过代理工厂创建代理对象
TeacherDao proxyInstance = (TeacherDao) new ProxyFactory(teacherDao).getProxyInstance();
//通过代理对象调用目标对象方法
String retVal = proxyInstance.teach();
System.out.println("retVal=" + retVal);

 

5、代理模式 的变体(应用场景)

几种常见的代 理模式介绍一几种变体

  • 防火墙代理:内网通过代理穿透防火墙,实现对公网的访问
  • 缓存代理:比如:当请求图片文件等资源时,先到缓存代理取,如果取到资源则 ok;如果取不到资源,再到公网或者数据库取,然后缓存
  • 远程代理:远程对象的本地代表,通过它可以把远程对象当本地对象来调用。远程代理通过网络和真正的远程对象沟通信息

  

  • 同步代理:主要使用在多线程编程中,完成多线程间同步工作

 

相关文章:

设计模式——代理模式

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1、代理模式的基本介绍 2、静态代理 3、JDK动态代理 4、Cglib 代理 5、代理模式 的变体&#xff08;应用场景&#xff09; 1、…...

Shiro-721---漏洞复现

漏洞原理 Shiro rememberMe 反序列化远程代码执行漏洞 由于 Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 rememberMe 字段存 在问题&#xff0c;用户可通过 Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段&#xff0c;并重新请求网站&#xff0c;进…...

Linux【模拟实现C语言文件流】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、FILE 结构设计2、函数使用及分析3、文件打开 fopen4、文件关闭 fclose5、缓…...

APK文件结构

文件结构 assets文件用来存放需要打包到Android 应用程序的静态资源文件&#xff0c;例如图片资源文件&#xff0c;JSON配置文件&#xff0c;渠道配置文件&#xff0c;二进制数据文件&#xff0c;HTML5离线资源文件等 与res/raw目录不同的数&#xff0c;assets目录支持任意深度…...

RabbitMQ死信队列延迟交换机

RabbitMQ死信队列&延迟交换机 1.什么是死信 死信&死信队列 死信队列的应用&#xff1a; 基于死信队列在队列消息已满的情况下&#xff0c;消息也不会丢失实现延迟消费的效果。比如&#xff1a;下订单时&#xff0c;有15分钟的付款时间 2. 实现死信队列 2.1 准备E…...

武忠祥老师每日一题||不定积分基础训练(六)

解法一&#xff1a; 求出 f ( x ) , 进而对 f ( x ) 进行积分。 求出f(x),进而对f(x)进行积分。 求出f(x),进而对f(x)进行积分。 令 ln ⁡ x t , 原式 f ( t ) ln ⁡ ( 1 e t ) e t 令\ln xt,原式f(t)\frac{\ln (1e^t)}{e^t} 令lnxt,原式f(t)etln(1et)​ 则 ∫ f ( x ) d…...

C语言结构体详解

结构体是C语言中的一种高级数据类型&#xff0c;它可以将不同的数据类型组合在一起&#xff0c;形成一个自定义的数据类型。结构体为程序员提供了一种组织数据的方式&#xff0c;它为程序开发带来了极大的灵活性和扩展性。 C语言中的结构体定义如下&#xff1a; struct 结构体…...

非盲去模糊简单介绍

文章目录 非盲去模糊简单介绍基于频域的方法1. Wiener滤波器2. 逆滤波器和半正定滤波器 基于空域的方法1. 均值滤波器2. 高斯滤波器3. 双边滤波器 基于偏微分的方法1. 非线性扩散滤波2. 全变分模型3. Laplacian正则化模型 振铃效应应用总结 非盲去模糊简单介绍 非盲去模糊是一…...

C语言动态内存管理与文件操作:打造高效通讯录

本篇博客会讲解如何使用C语言实现一个通讯录。实现通讯录的过程中&#xff0c;会大量用到C语言的知识点&#xff0c;包括但不限于&#xff1a;函数、自定义类型、指针、动态内存管理、文件操作&#xff0c;这些知识点在我的其他博客中都有讲解过&#xff0c;欢迎大家阅读&#…...

2001-2021年全国30省就业人数数据

2001-2021年全国30省就业人数数据/各省就业人数数据 1、时间&#xff1a;2001-2021年 2、范围&#xff1a;包括30个省市不含西藏 3、指标&#xff1a;就业人数 4、来源&#xff1a;各省NJ、社会统计NJ 5、缺失情况说明&#xff1a;无缺失 6、指标说明&#xff1a; 就业人…...

自然语言处理知识抽取(pkuseg、DDParser安装及使用)

一、分词简介 1.基本概念 分词是自然语言处理中的一个重要步骤&#xff0c;它可以帮助我们将文本分成一个个词语&#xff0c;以便更好地理解和分析文本。在计算机视觉、语音识别、机器翻译等领域&#xff0c;分词都扮演着重要的角色。 目前&#xff0c;常用的分词库包括 jie…...

Linux内核面试知识总结

Linux启动过程 1、主机加电自检&#xff0c;加载BIOS硬件信息 2、读取MBR引导文件 3、引导linux内核 4、启动第一个进程init&#xff08;进程号永远为1&#xff09; 5、进度相应的运行级别 6、运行终端&#xff0c;输入用户名和密码 linux系统缺省的运行级别 关机、单机…...

深度学习模型压缩与优化加速

1. 简介 深度学习&#xff08;Deep Learning&#xff09;因其计算复杂度或参数冗余&#xff0c;在一些场景和设备上限制了相应的模型部署&#xff0c;需要借助模型压缩、系统优化加速、异构计算等方法突破瓶颈&#xff0c;即分别在算法模型、计算图或算子优化以及硬件加速等层…...

Kali 更换源(超详细,附国内优质镜像源地址)

1.进入管理员下的控制台。 2. 输入密码后点击“授权”。 3.在控制台内输入下面的内容。 vim /etc/apt/sources.list 4.敲击回车后会进入下面的页面。 5.来到这个页面后的第一部是按键盘上的“i”键&#xff0c;左下角出现“插入”后说明操作正确。 6.使用“#”将原本的源给注释…...

Java版工程项目管理系统平台+java版企业工程系统源码+助力工程企业实现数字化管理

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…...

搜索引擎测试报告

文章目录 一、项目背景二、项目功能三、测试目的四、测试环境五、测试计划1、功能测试2、自动化测试 六、测试结果 一、项目背景 java官方文档是我们在学习java语言中不可或缺的权威资料。相比于各种网站的Java资料&#xff0c;官方文档无论是语言表达还是组织方式都要更加全面…...

4年的测试工程师,你遇到过自身瓶颈期吗?又是怎样度过的?

从毕业到现在已经快4年啦&#xff0c;一直软件测试行业混迹。我不是牛人&#xff0c;但是自我感觉还算是个合格的测试工程师&#xff0c;有必要写下自己将近4年来的经历&#xff0c;给自我以提示&#xff0c;给刚入行的朋友提供点参考。 貌似这一点适应的行业最广&#xff0c;…...

【Python零基础学习入门篇④】——第四节:Python的列表、元组、集合和字典

⬇️⬇️⬇️⬇️⬇️⬇️ ⭐⭐⭐Hello&#xff0c;大家好呀我是陈童学哦&#xff0c;一个普通大一在校生&#xff0c;请大家多多关照呀嘿嘿&#x1f601;&#x1f60a;&#x1f618; &#x1f31f;&#x1f31f;&#x1f31f;技术这条路固然很艰辛&#xff0c;但既已选择&…...

3.6 cache存储器

学习步骤&#xff1a; 我会采取以下几个步骤来学习Cache存储器&#xff1a; 确定学习目标&#xff1a;Cache存储器作为一种高速缓存存储器&#xff0c;通常用于提高计算机系统的运行效率。因此&#xff0c;我需要明确学习Cache存储器的目的&#xff0c;包括了解其原理、结构和…...

Ubuntu零基础安装

Ubuntu零基础安装 首先我们需要安装VM&#xff0c;再安装ubuntu。 1、安装VM 进入VM官网 VM官网地址 选择下载试用版 下载Windows版本 下载完成后&#xff0c;点击安装包进行安装 至此就安装完毕了。 桌面会出现VM的图标。 点击打开&#xff0c;弹出如下画面&#xff1a; …...

热门的常用 API 大全分享

天气/环境 空气质量查询&#xff1a; 查询国内3400个城市的整点观测&#xff0c;获取指定城市的整点观测空气质量。未来7天生活指数&#xff1a;支持国内3400个城市以及国际4万个城市的天气指数数据&#xff0c;包括晨练、洗车、穿衣&#xff08;12项&#xff0c;有详细说明&a…...

利用粒子群算法设计无线传感器网络中的最优安全路由模型(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 无线传感器网络&#xff08;WSN&#xff09;由数十个、数百个甚至数千个自主传感器组成。这些传感器以无线方式嵌入环境中&…...

2023年华东杯数学建模B 题 期货价格相关性问题-思路解析

题目背景&#xff1a; 许多金融标的都有其内在的关联&#xff0c;如何从量价数据找到这种关联是一个有趣的 问题。例如在万得的“煤焦钢矿”板块中&#xff0c;有螺纹钢、铁矿石、不锈钢、热轧卷板、 硅铁、焦煤、焦炭、锰硅、线材 9 个品种。这些品种有些是上下游关系&…...

SAP UI5 之Controls (控件) 笔记三

文章目录 官网 Walkthrough学习-Controls控件1.0.1 在index.html中使用class id 属性控制页面展示的属性1.0.2 我们在index.js文件中引入 text文本控制1.0.3打开浏览器查看结果 官网 Walkthrough学习-Controls控件 Controls控件 在前面展示在浏览器中的Hello World 是在Html …...

哈希表题目:设计地铁系统

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;设计地铁系统 出处&#xff1a;1396. 设计地铁系统 难度 6 级 题目描述 要求 一个地铁系统正在收集乘客在不同站之间的花费时间。他们在使用这些数…...

云时通OMS:为零售品牌商打造高效的全渠道订单管理!

传统的零售企业围绕“人、货、场” 三要素来展开营销&#xff0c;其目标是基于“场”将货销售给更多的人。随着数字技术的应用&#xff0c;新零售模式下的“场”除了传统的线下店铺外&#xff0c;还拓展了多元化的线上渠道&#xff0c;比如小程序、企业APP、第三方平台、电商直…...

有必要给孩子买台灯吗?分享四款高品质的护眼台灯

有必要使用护眼台灯&#xff0c;尤其是有近视现象的孩子们。 现在很多孩子小学就开始近视了&#xff0c;保护视力刻不容缓呀! 很多人不知道&#xff0c;其实劣质光线是最大的眼睛杀手 给孩子随便买便宜的台灯&#xff0c;看着一样能用&#xff0c;其实时间久了 对孩子眼睛的…...

模板方法模式

模板方法模式 模板方法模式定义:使用场景角色定义抽象模板: 为抽象模板&#xff0c;它的方法分为两类AbstractClass1. 基本方法: 也叫做基本操作&#xff0c;是由子类实现的方法&#xff0c;并且在模板方法被调用。2. 模板方法: 可以有一个或几个&#xff0c;一般是一个具体方法…...

基于Yolov5的NEU-DET钢材表面缺陷检测,优化组合新颖程度较高:CVPR2023 DCNV3和InceptionNeXt,涨点明显

1.钢铁缺陷数据集介绍 NEU-DET钢材表面缺陷共有六大类,分别为:crazing,inclusion,patches,pitted_surface,rolled-in_scale,scratches 每个类别分布为: 训练结果如下: 2.基于yolov5s的训练 map值: 2.1 Inception-MetaNeXtStage 对应博客:https://cv2023.blog.csdn.n…...

【HarmonyOS】自定义组件之ArkUI实现通用标题栏组件

【关键字】 标题栏、常用内置组件整合、ArkUI、自定义组件 1、写在前面 在上一篇文章中我们通过Java语言实现了一个通用的标题栏组件&#xff0c;有需要的可以看下&#xff0c;文章地址&#xff1a; 华为开发者论坛 现在很多朋友都已经转战ArkTS语言了&#xff0c;那么今天…...

做英语题目的网站/百度做广告怎么做

JVM监控工具 Java的安装包自带了很多优秀的工具&#xff0c;善用这些工具对于监控和调试Java程序非常有帮助。常用工具如下&#xff1a; jps 用途&#xff1a;jps用来查看JVM里面所有进程的具体状态, 包括进程ID&#xff0c;进程启动的路径等等。 常用参数&#xff1a; -l: 输…...

网站找谁做/美国新冠疫情最新消息

Maven 进阶Maven 依赖机制传统方式Maven 的方式解释说明Maven POMPOM 的例子Maven 插件插件类型Maven 快照什么是快照&#xff1f;快照与版本Maven 依赖机制 在 Maven 依赖机制的帮助下自动下载所有必需的依赖库&#xff0c;并保持版本升级。让我们看一个案例研究&#xff0c;…...

wordpress图像大小/建站快车

ERP扩充了MIS管理信息系统、MRP制造资源计划的管理范围&#xff0c;对供应链上的所有环节进行有效管理&#xff0c;追求企业资源的合理高效利用。CRM&#xff1a;以客户为中心。支柱性功能: 市场营销和客户服务。共享的客户资料库把市场营销和客户服务连接起来。供应链&#xf…...

地方门户网站赚钱吗/网络推广属于什么专业

ELM是一种纯功能的、强类型的、反应性的、事件驱动的Web前端语言&#xff0c;与其他客户机框架不同&#xff0c;Elm语言肯定不是“另一个JavaScript库”&#xff0c;但是它也有很多优点。 1.没有HTML和JavaScript的客户端编程 无需在JavaScript中生成HTML&#xff0c;也无需使用…...

建站公司推广/百度快速排名工具

字符串转换为数字异常 当试图将一个String转换为指定的数字类型&#xff0c;而该字符串确不满足数字类型要求的格式时&#xff0c;抛出该异常.如现在讲字符型的数据“123456”转换为数值型数据时&#xff0c;是允许的。 但是如果字符型数据中包含了非数字型的字符&#xff0c;如…...

深圳网站维护页面设计/南阳seo优化

lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表 达式值的函数 1、lambda 函数比较轻便&#xff0c;即用即仍&#xff0c;很适合需要完成一项功能&#xff0c;但是此功能只 在此一处使用&#xff0c;连名字都很随意的情况下&#xff1b; 2、匿名函数&a…...