静态代理模式
真实角色
代理角色(自定义)
两个角色实现同一接口
- 实现方式:继承 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 生成动态代理