JDK 代理生成器,在生成类是会根据参数“sun.misc.ProxyGenerator.saveGeneratedFiles”来决定是否将二进制保存到本地文件中,
具体的路径查看源码:
ProxyGenerator.access$000(this.val$name) + ".class"
根据access$000这个方法生成的路径来保存
在openjdk中这个access$000 是对应
private static String dotToSlash(String name) {
return name.replace('.', '/');
}
所以文件是保存在
FileOutputStream localFileOutputStream = new FileOutputStream(ProxyGenerator.access$000(this.val$name) + ".class");
可以测试一下这个文件存放的具体路径:
FileOutputStream file = new FileOutputStream("$Proxy0" + ".class");
System.out.println(new File("$Proxy0" + ".class").getAbsolutePath());
这样在下面生成动态代理类的时候会将class文件保存
反编译class文件,可以看到有一个参数为InvocationHandler的构造方法,实现接口方法种的代码如下:
表明代理类只是做了一层封装,具体实现是在InvocationHandler中来做。
具体的路径查看源码:
ProxyGenerator.access$000(this.val$name) + ".class"
根据access$000这个方法生成的路径来保存
在openjdk中这个access$000 是对应
private static String dotToSlash(String name) {
return name.replace('.', '/');
}
所以文件是保存在
FileOutputStream localFileOutputStream = new FileOutputStream(ProxyGenerator.access$000(this.val$name) + ".class");
可以测试一下这个文件存放的具体路径:
FileOutputStream file = new FileOutputStream("$Proxy0" + ".class");
System.out.println(new File("$Proxy0" + ".class").getAbsolutePath());
这样在下面生成动态代理类的时候会将class文件保存
反编译class文件,可以看到有一个参数为InvocationHandler的构造方法,实现接口方法种的代码如下:
public final void printA()
throws
{
try
{
this.h.invoke(this, m3, null);
return;
}
catch (RuntimeException localRuntimeException)
{
throw localRuntimeException;
}
catch (Throwable localThrowable)
{
}
throw new UndeclaredThrowableException(localThrowable);
}
表明代理类只是做了一层封装,具体实现是在InvocationHandler中来做。
本文详细解析了JDK代理机制中的动态代理类生成过程,包括如何根据参数决定是否将生成的代理类保存到本地文件中,以及具体保存路径的确定方式。通过分析源码,揭示了动态代理类实现接口方法的具体机制。
184

被折叠的 条评论
为什么被折叠?



