动态代理在Java中有着广泛的应用,比如Spring AOP、Hibernate数据查询、测试框架的后端mock、RPC远程调用、Java注解对象获取、日志、用户鉴权、全局性异常处理、性能监控,甚至事务处理等。
基本概念
假设有一个表示接口的Class对象(有可能只包含一个接口),它的确切类型在编译时无法知道。要想构造一个实现这些接口的类,就需要使用newInstance方法或反射找出这个类的构造器。但是,不能实例化一个接口,需要在程序处于运行状态时定义一个新类。
- 代理模式:为一个对象提供一个代理,以控制对这个对象的访问。代理类负责为委托类预处理消息、过滤消息、转发消息以及事后处理消息等。
- 动态代理:在程序运行时,通过反射机制动态创建代理类及其对象。与静态代理相比,动态代理不需要为每一个委托类编写一个代理类。
创建代理对象
使用Proxy.newProxyInstance方法创建一个代理对象。
Proxy.newProxyInstance
方法签名
public static Object newProxyInstance(
ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h
) throws IllegalArgumentException