文章目录
前言
反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息。而动态代理,则是延伸出来的一种广泛应用于产品开发中的技术,很多繁琐的重复编程,都可以被动态代理机制优雅地解决。
前置知识代理模式
场景模拟用户下单调用供应商添加代理日志
1 Demo.java
2 ProxySubOrder.java 代理日之类
3 RealSubOrder.java 实现类
4 SubOrder.java 接口
Demo.java
/**
* @ClassName Demo
* @Author xiaojinlu
* @Date 2020/11/5 17:03
* @Version 1.0
*/
public class Demo {
public static void main(String[] args) {
SubOrder subOrder = new ProxySubOrder();
subOrder.getSupplier();
}
}
ProxySubOrder.java
import org.springframework.beans.factory.annotation.Autowired;
/**
* 主要添加供应商调用前后日志
* 代理下单在调用供应商的时候组做些事情
* @ClassName ProxySubOrder
* @Author xiaojinlu
* @Date 2020/11/5 17:07
* @Version 1.0
*/
public class ProxySubOrder implements SubOrder{
@Autowired
private ProxySubOrder proxySubOrder;
@Override
public void getSupplier() {
System.out.println("start invoke supplier");
//or SubOrder subOrder = new ProxySubOrder(); local Test implement this
proxySubOrder.getSupplier();
System.out.println("end invoke supplier");
}
}
RealSubOrder.java
/**
* @ClassName RealSubOrder
* @Author xiaojinlu
* @Date 2020/11/5 17:06
* @Version 1.0
*/
public class RealSubOrder implements SubOrder {
@Override
public void getSupplier() {
System.out.println("do Something");
}
}
SubOrder.java
/** 接口
* @ClassName SubOrder
* @Author xiaojinlu
* @Date 2020/11/5 17:04
* @Version 1.0
*/
public interface SubOrder {
void getSupplier();
}
一、定义
在不影响原始代码的情况下对原功能进行功能增强。反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息。而动态代理,则是延伸出来的一种广泛应用于产品开发中的技术,很多繁琐的重复编程,都可以被动态代理机制优雅地解决。二、应用场景
1.日志
2.用户鉴权
3.全局性异常处理
4.性能监控
5.事务处理
等
AOP 通过(动态)代理机制可以让开发者从这些繁琐事项中抽身出来,大幅度提高了代码的抽象程度和复用度。从逻辑上来说,我们在软件设计和实现中的类似代理,如 Facade、Observer 等很多设计目的,都可以通过动态代理优雅地实现。
三、代理分类
----静态代理:事先写好代理类,可以手工编写,也可以工具生成。缺点是每个业务类都要对应一个代理类,非常不灵活。
----动态代理:运行时自动生成代理对象。缺点是生成代理对象和调用代理方法都要额外花费时间。
----JDK动态代理:基于Java 反射机制实现,必须要了解接口的业务类型才能用这种办法生成代理对象。新版本也开始结合ASM机制。
----cglib动态代理: 基于ASM机制实现,通过生成业务类的子类作为代理类。
四、扩展
反射机制
① 引入
Java的反射机制在平时的业务开发过程中很少用到,但是在一些基础框架的搭建上应用非常广泛
②什么是Java反射机制
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
③反射机制提供了哪些功能
----在运行时判定任意一个对象所属的类
----在运行时构造任意一个类的对象
----在运行时判定任意一个类所具有的成员变量和方法
----在运行时调用任意一个对象的方法
----生成动态代理
④ 反射机制的应用场景
----动态代理(AOP、RPC)
----提供第三方开发者扩展能力(Servlet容器、JDBC连接)
----第三方组件创建对象(OI)
----逆向代码,例如反编译
----与注解相结合的框架,例如Retrofit
----单纯的反射机制应用框架,例如EventBus 2.x
----动态生成类框架 例如Gson
⑤反射机制的优缺点:
----优点:运行期类型的判断,动态类加载,动态代理使用反射
----缺点:性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。
JDK Proxy 的优势:
最小化依赖关系,减少依赖意味着简化开发和维护,JDK 本身的支持,可能比 cglib 更加可靠。
平滑进行 JDK 版本升级,而字节码类库通常需要进行更新以保证在新版 Java 上能够使用。
代码实现简单。
基于类似 cglib 框架的优势:
有的时候调用目标可能不便实现额外接口,从某种角度看,限定调用者实现接口是有些侵入性的实践,类似 cglib 动态代理就没有这种限制。
只操作我们关心的类,而不必为其他相关类增加工作量。
高性能。
总结
1 减小了代码的冗余。
2 实现了统一处理的能力。