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

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

阅读 3.5k
3 个回答
怎么理解JAVA JDK动态代理只能基于接口做代理?

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

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

是的

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

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题