JDK动态代理

1,静态代理

1)静态代理
JDK动态代理_第1张图片
image.png
JDK动态代理_第2张图片
image.png

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

JDK动态代理_第3张图片
image.png

JDK动态代理_第4张图片
image.png
JDK动态代理_第5张图片
image.png

Class cl = getProxyClass0(loader, intfs);
subKeyFactory.apply(key, parameter)
生成的Class代理类,com.sun.proxy.$Proxy0
JDK动态代理_第6张图片
image.png

String proxyName = proxyPkg + proxyClassNamePrefix + num;
image.png

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();
}
JDK动态代理_第7张图片
image.png

3,代理类细节

1)Proxy代理类生成的对象。JDK的动态代理,生成的新代理类就是继承了Proxy基类,实现了传入的接口的类。
extends Proxy implements Myinterface。
2)Proxy类有一个成员变量InvocationHandler

JDK动态代理_第8张图片
image.png

生成代理类时,会初始化一个InvocationHandler
JDK动态代理_第9张图片
image.png

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

你可能感兴趣的:(JDK动态代理)