Java动态代理

代理模式的使用场景:当我们想要在一个已经存在的类上面增加或者修改一些功能时使用。代理对象通常代替原始对象使用,所以代理对象必须要是原始对象相同的接口类型或者是子类型。

在Java中实现动态代理需要涉及到两个角色proxy class(Proxy.newProxyInstance生成)和handler(用户实现的InvocationHandler)。JDK之所以这样设计,是依据单一职责原则:proxy class仅仅完成代理,handler完成真实行为的修改。从另一方面来看,proxy class在运行时生成,但是handler是在源代码中编码并且进行了编译,运行时生成的东西越少,程序运行速度越快。

// 所有接口数组中接口方法的调用都会被转发给invocationHandler:
// 也就是调用h.invoke(this, method, args)
public static Object newProxyInstance(ClassLoader loader, Class<?>[]interfaces,InvocationHandler h)
  
class MyInvocationHandler implements InvocationHandler{
    // 在InvocationHandler的实现类中持有原始对象的引用,这是为了通过反射调用原始对象的方法。
  	Object origin = ...
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // proxy对象很少使用
        return null;
    }
}
原文地址:https://www.cnblogs.com/memo20/p/13139379.html