我理解如何在Java中使用动态代理,但我不明白VM是如何实际创建动态代理的。它会生成字节码并加载吗?或者是其他东西?感谢。
答案 0 :(得分:12)
至少对于Sun的实现,如果查看java.lang.reflect.Proxy
的源代码,您会看到是,它会动态生成字节代码(使用类sun.misc.ProxyGenerator
)。
答案 1 :(得分:5)
我建议您阅读Dynamic Proxy Classes:
Proxy.getProxyClass方法返回 代理的java.lang.Class对象 给出类加载器和类的类 接口数组。代理类 将在指定的类中定义 装载机并将实施所有的 提供的接口。如果是代理类 对于相同的接口排列 已经在课堂上定义了 loader,然后是现有的代理类 将被退回; 否则,代理人 这些接口的类将是 动态生成并定义 类加载器。 [强调我的]
答案 2 :(得分:1)
代理类是动态生成的(因此是动态代理),并由类加载器加载。这就是为什么如果您调试依赖JDK代理的应用程序,则会看到一堆名为“ com.sun.proxy。$ Proxy0 ”的类。
为了检验我的理论,您可以使用Dynamic proxy classes 中的示例以及VM参数 -verbose:class ,它会告诉您类加载器已加载的类,并且您会注意到加载的类之间 com.sun.proxy。$ Proxy0 。