JDK动态代理

1,静态代理

1)静态代理
image.png
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

image.png

image.png
image.png

Class<?> cl = getProxyClass0(loader, intfs);
subKeyFactory.apply(key, parameter)
生成的Class代理类,com.sun.proxy.$Proxy0
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();
}
image.png

3,代理类细节

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

image.png

生成代理类时,会初始化一个InvocationHandler
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 事例 小张是一个普普通通的码农,每天勤勤恳恳地码代码。某天中午小张刚要去吃饭,一个电话打到了他的手机上。“是XX公...
    余平的余_余平的平阅读 539评论 0 0
  • Java代理和动态代理机制分析和应用 概述 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个...
    丸_子阅读 3,189评论 6 57
  • 版权声明:本文为博主原创文章,未经博主允许不得转载 前言 Java 代理模式在 Android 中有很多的应用。比...
    cc荣宣阅读 978评论 0 7
  • 动机 学习动机来源于RxCache,在研究这个库的源码时,被这个库的设计思路吸引了,该库的原理就是通过动态代理和D...
    却把清梅嗅阅读 465评论 0 1
  • 提到理财,很多人的第一反应就是:学习理财投资当然是为了赚钱啦,除此之外还能有其他别的目标吗? 赚钱当然很重要,可是...
    丛丛xu阅读 365评论 1 1

友情链接更多精彩内容