代理模式
Posted mabaoqing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式相关的知识,希望对你有一定的参考价值。
静代理模式
真实角色
代理角色(自定义)
两个角色实现同一接口
- 实现方式:继承 VS 聚合(构造方法为真实对象赋值)
例:线程Thread
// 产生一个代理对象
Thread proxy = new Thread(new Runnable() {
public void run() {}
});
// 调用代理对象的方法
proxy.start();
动态代理:
基于接口:jdk自带的动态代理
java.lang.reflect.Proxy类提供用于创建动态代理类和实例的静态方法
java.lang.reflect.InvocationHandler接口
- 通过 invoke() 实现对真实角色的代理访问
- 每次通过Proxy生成代理对象时都要指定对应的InvocationHandler对象
public class ProxyInvocationHandler implements InvocationHandler {
//真实对象
private Object target;
public ProxyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理方法开始.....");
Object result = method.invoke(target, args);
System.out.println("代理方法结束.....");
return result;
}
}
// 测试方法
public void test() {
Role realRole = new RealRole();
ProxyInvocationHandler handler = new ProxyInvocationHandler(realRole);
// 生成代理类
Role proxy = (Role) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),realRole.getClass().getInterfaces(),handler);
// 实际上会调用 handler 的 invoke 方法
proxy.sing();
}
- 基于类:cglib
- 使用 javassist 生成动态代理
以上是关于代理模式的主要内容,如果未能解决你的问题,请参考以下文章