1,静态代理
1)静态代理
2,动态代理
1)newProxyInstance生成代理类的实例
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
loader(类加载器
):the class loader to define the proxy class
interfaces(代理类要实现的接口
):the list of interfaces for the proxy class to implement
h(InvocationHandler
):the invocation handler to dispatch method invocations to每一个proxy实例,都关联一个InvocationHandler。
2)当proxy调用一个方法,会dispatch到invocationHandler,handler会拥有一个proxied(target目标对象
)实例,底层使用反射调用proxied(target
)的方法。
public Object invoke(Object proxy, Method method, Object[] args)
3)创建Proxy对象。
java.lang.reflect.Proxy类,provides static methods for creating dynamic proxy classes and instances
Class<?> cl = getProxyClass0(loader, intfs);
subKeyFactory.apply(key, parameter)
生成的Class代理类,com.sun.proxy.$Proxy0
String proxyName = proxyPkg + proxyClassNamePrefix + num;
4)动态代理实例
m1 = Method 反射获取doSomething方法
此处的doSomething()方法,就已经不是原始的MyInterface里的doSomething()方法了,而是新生成的代理类的doSomething()方法。
proxy.doSomething()底层,proxy.invocationHandler.invoke(this, m1, null),就是调用m1.invoke(realObject, null)
public static void consumer(MyInterface proxy){
proxy.doSomething();
}
3,代理类细节
1)Proxy代理类生成的对象。
JDK的动态代理,生成的新代理类就是继承了Proxy基类,实现了传入的接口的类。
extends Proxy implements Myinterface。
2)Proxy类有一个成员变量InvocationHandler
生成代理类时,会初始化一个InvocationHandler
3)返回对象理解
InvocationHandler的invoke方法,返回的Object是真实对象方法的返回结果:Object invoke(Object proxy, Method method, Object[] args) throws Throwable
Proxy的newProxyInstance方法,返回Object是代理类的实例:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException