动态代理
三、Java的动态代理
1. 代理
张三.租房() --->房东.租房();
张三.租房() --->中介.租房() --->房东.租房();
张三.演唱()--->明星.演唱()
张三.演唱()--->经纪人.演唱()--->明星.演唱()
代理:当不能、不方便直接调用目标对象时,可以通过代理对象,间接调用目标对象
有两种代理模式:
-
静态代理(装饰者模式):代理类是提前创建好的。 我们直接创建代理对象,通过代理对象调用目标对象
-
动态代理:代理类不存在,在程序运行过程,动态生成的代理类、代理类对象。我们再通过代理对象调用目标对象
2. Java的动态代理实现
注意:
Java的动态代理Proxy.newProxyInstance方法,是基于接口的动态代理
cglib动态代理,是基于子类的
2.1 API
-
java.lang.reflect.Proxy
Object proxyObject = Proxy.newProxyInstance(
ClassLoader loader,
Class[] interfaces,
InvocationHandler h
);
-
返回值:
-
一定是 接口的一个实现类对象
-
-
参数:
-
loader:类加载器
-
interfaces:代理类要实现的接口,注意参数的类型是
Class[]
String[] arr = new String[]{"string1", "string2"};
Class[] arr = new Class[]{接口名.class, 接口名.class}
-
h:代理类的方法里, 要执行的代码
-
通常是增强目标对象的方法;控制目标对象的方法执行
-
是
InvocationHandler
接口,通常创建一个匿名内部类
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args){
//proxy:代理对象
//method:我们调用的方法Method对象
//args:我们调用方法时,传递的实参
//写代码:增强目标对象,控制目标对象
//调用之前,可以增加一些代码
//调用目标对象的method方法
//调用之后,可以增加一些代码
//我们调用代理对象时,得到的返回值结果
return 返回值;
}
}
-
-