详解JAVA代理

简介: 1.概述代理:其实就是代替处理的意思。又称委托模式,为目标对象提供(包装)了一个代理,这个代理可以控制对目标对象的访问。外界不直接访问目标对象,而是访问代理对象,再由代理对象调用目标对象。

1.概述

代理:其实就是代替处理的意思。又称委托模式,为目标对象提供(包装)了一个代理,这个代理可以控制对目标对象的访问。外界不直接访问目标对象,而是访问代理对象,再由代理对象调用目标对象。

e2d0f96b65b046298c3f5f1127ceba06.png

2.静态代理

代理对象持有目标对象的一个句柄,

其实就是将目标对象的引用作为代理对象的成员变量。

类关系:

cfe1f07b4c4048ddb56573fc04883c78.png

代码示例:

接口:

9f91ffa6f13248e6acfd34306d364f22.png

目标对象:

220c4613e0a040ffaa030b9ca966f457.png

代理对象:

52514d7878ac43b5bf83154806ea847e.png

测试:

872c3799275240a1ac71c46c40b16c03.png

缺点:

因为要对目标对象的每个方法都进行静态编码包装,所以目标对象中有多少个方法,静态代理对象中就需要有多少个方法。目标对象中方法过多的时候,代理对象就会显的臃肿,也不便于维护和拓展。

3.动态代理

动态代理,产生一个被处理器全面监听的代理对象出来,这个代理对象的每次方法调用都会被处理器拦截下来。静态代理中的处理逻辑全部抽象在处理器中。

de91e6840edd4e59bf03f46d4ab0999e.png

代码示例:

接口:

7780bc82300746ef8e69f06560fc3963.png

目标对象:

048f003e7ea64fc1b9a454761e3db4fe.png

处理器:

85a2ac8142db4efb8d4265bc79c3b832.png

测试:

13131cfcada341ccbc394b1b15c1808e.png

动态代理的代理对象必须实现接口,是因为代理模式本质上是给目标对象裹上一层外壳,而这个外壳肯定要和代理对象的形状一样,因此在创建代理对象的时候要给出一个模板,即要传给其一个接口。

目录
相关文章
|
20天前
|
Java
JAVA 静态代理 & 动态代理
【11月更文挑战第14天】静态代理是一种简单的代理模式实现,其中代理类和被代理类的关系在编译时已确定。代理类实现与被代理类相同的接口,并持有被代理类的实例,通过调用其方法实现功能增强。优点包括代码结构清晰,易于理解和实现;缺点是对于多个被代理类,需为每个类编写相应的代理类,导致代码量大增,维护成本高。动态代理则在运行时动态生成代理类,更加灵活,减少了代码冗余,但可能引入性能损耗和兼容性问题。
|
2月前
|
设计模式 Java API
[Java]静态代理与动态代理(基于JDK1.8)
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
30 0
[Java]静态代理与动态代理(基于JDK1.8)
|
6月前
|
缓存 运维 负载均衡
java面试题之个人对正向代理和反向代理的理解
java面试题之个人对正向代理和反向代理的理解
1084 3
|
2月前
|
Java
Java访问外网图片地址时,如何添加代理?
【10月更文挑战第14天】Java访问外网图片地址时,如何添加代理?
39 2
|
2月前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
4月前
|
缓存 负载均衡 安全
|
5月前
|
数据采集 安全 Java
Java Selenium WebDriver:代理设置与图像捕获
Java Selenium WebDriver:代理设置与图像捕获
|
5月前
|
设计模式 Java
Java进阶之代理
Java进阶之代理
30 3
|
5月前
|
设计模式 Java
Java进阶之代理
【7月更文挑战第16天】Java动态代理通过`java.lang.reflect.Proxy`和`InvocationHandler`实现,无需编译期定义代理类。与静态代理相比,它更灵活,代码更简洁,适用于方法数量变化或未知接口代理。
31 2
|
5月前
|
Java 数据库 Spring
Java编程问题之在测试中使用CGLIB创建代理类如何解决
Java编程问题之在测试中使用CGLIB创建代理类如何解决