Java的动态代理实际上是如何工作的?

11

我知道如何在Java中使用动态代理,但我不明白虚拟机实际上是如何创建动态代理的。它是生成字节码并加载吗?还是其他什么方式?谢谢。

我了解如何在Java中使用动态代理,但我不清楚虚拟机是如何创建动态代理的。它是通过生成字节码并加载来实现的吗?还是采用其他方式?谢谢。

1
詹姆斯,你就像是Java大师一样。你只是在用这个问题来测试我们吗? - erickson
1
哈哈。我知道Java语言,但我不是真正的虚拟机专家。 :) - James Ward
3个回答

13

至少对于Sun的实现而言,如果你查看 java.lang.reflect.Proxy 的源代码,你会发现它确实会即时生成字节码(使用 sun.misc.ProxyGenerator 类)。


5
我建议您阅读《动态代理类》(Dynamic Proxy Classes)文档:http://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html
Proxy.getProxyClass方法会返回一个java.lang.Class对象,该对象表示给定类加载器和接口数组的代理类。代理类将在指定的类加载器中定义,并实现所有提供的接口。如果已经为相同接口组合定义了代理类,则会返回现有的代理类;否则,将动态生成并定义该接口的代理类。

2
代理类是即时生成的(因此是动态代理),并且由类加载器加载。这就是为什么如果您调试依赖于JDK代理的应用程序,您会看到一堆名为“com.sun.proxy.$Proxy0”的类。
为了测试我的理论,您可以使用动态代理类的示例以及VM参数-verbose:class进行验证,该参数将告诉您加载的类由类加载器加载,并且你会注意到在加载的类中有com.sun.proxy.$Proxy0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接