我知道如何在Java中使用动态代理,但我不明白虚拟机实际上是如何创建动态代理的。它是生成字节码并加载吗?还是其他什么方式?谢谢。 我了解如何在Java中使用动态代理,但我不清楚虚拟机是如何创建动态代理的。它是通过生成字节码并加载来实现的吗?还是采用其他方式?谢谢。
我建议您阅读《动态代理类》(Dynamic Proxy Classes)文档:http://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html。Proxy.getProxyClass方法会返回一个java.lang.Class对象,该对象表示给定类加载器和接口数组的代理类。代理类将在指定的类加载器中定义,并实现所有提供的接口。如果已经为相同接口组合定义了代理类,则会返回现有的代理类;否则,将动态生成并定义该接口的代理类。
代理类是即时生成的(因此是动态代理),并且由类加载器加载。这就是为什么如果您调试依赖于JDK代理的应用程序,您会看到一堆名为“com.sun.proxy.$Proxy0”的类。为了测试我的理论,您可以使用动态代理类的示例以及VM参数-verbose:class进行验证,该参数将告诉您加载的类由类加载器加载,并且你会注意到在加载的类中有com.sun.proxy.$Proxy0。