动态代理结构
- 代理模式的结构比较简单,主要是通过定义一个继承抽象主题的代理来包含真实主题,从而实现对真实主题的访问。
- 代理模式的主要角色如下:
- 在代码中,一般代理会被理解为代码增强,实际上就是在原代码逻辑前后增加一些代码逻辑,而使调用者无感知。
- 静态:由程序员创建代理类或特定工具自动生成源代码再对其编译,在程序运行前代理类的 .class 文件就已经存在了。
- 动态:在程序运行时,运用反射机制动态创建而成
动态代理实现
动态代理分为三大类
1、基于接口的动态代理---------JDK动态代理
2、基于类的动态代理----------cglib
3、java字节码实现----------javasist
Proxy(代理)
InvocationHandler(调用处理程序)
- 只有一个方法invoke
通用动态代理代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//通用代理,利用反射
public class ProxyInvocationHandler implements InvocationHandler {
//被代理的接口
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//生成得到的代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
}
//处理代理实例并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(target, args);
return result;
}
}
测试(真实角色来自上一篇静态代理)
public class Client {
public static void main(String[] args) {
//真实角色
Landlord landlord=new Landlord();
//代理角色(不存在)
ProxyInvocationHandler pih = new ProxyInvocationHandler();
//设置要代理的对象
pih.setTarget(landlord);
//动态生成代理类
Rent proxy = (Rent) pih.getProxy();
proxy.rent();
}
}
- 结果如下