【jdk动态代理】怎么理解JAVA JDK动态代理只能基于接口做代理,这里的接口指的是被代理必须实现接口么?

发布于 2022-09-12 02:23:50 字数 100 浏览 21 评论 0

【jdk动态代理】怎么理解JAVA JDK动态代理只能基于接口做代理? 这里的接口指的是被代理必须实现接口么,但我看有文章里说被代理类没有实现接口的话它的publc方法也是可以被代理的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

贵在坚持 2022-09-19 02:23:50

怎么理解JAVA JDK动态代理只能基于接口做代理?

JDK动态代理是通过重新生成一个类实现代理对象的接口来达到代理的,所以只能基于接口

这里的接口指的是被代理必须实现接口么

是的

但我看有文章里说被代理类没有实现接口的话它的publc方法也是可以被代理的

要么你理解错了,要么它讲错了

自找没趣 2022-09-19 02:23:50
动态代理增强的是委托类的功能,这里的委托类就是接口的实现类。其实动态代理就是为了避免手动写代理类。如果你不好理解,可以先看下静态代理实现。如果你要增强某个实现类的功能,静态代理的做法就是再写一个实现类去实现委托类相同的接口,然后注入委托类去实现接口,只是在实现前后加入增强功能的代码。
回到动态代理,只是通过反射去拿到相对应的接口实现
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),  /** 获取委托类的类加载器,所谓委托类就是接口实现类 */
                    target.getClass().getInterfaces(),                             /** 获取委托类实现的所有接口 */
                    this);

看到上面这个方法getInterfaces()应该就不用解释为什么动态代理基于接口做代理

神回复 2022-09-19 02:23:50

怎么理解JAVA JDK动态代理只能基于接口做代理?

因为JDK动态代理的实现方式就是基于接口的啊..
假设你有接口A,你要代理类B(实现接口A),那么JDK会生成一个实现了接口A的代理类类C
call graph为 Proxy.method() -> InvocationHandler.invoke() -> TargetClass.method()
你按照API写一遍,再反编译一下生成的类,一看就明白了啊...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文