JAVA查看代理类
1. 代理类 class 生成
- System.setProperty
// jdk8及之前的设置
System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
// or
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
// jdk8之后的设置
System.setProperty("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");
// or
System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");
- IDEA VM options
// jdk8及之前的设置
-Djdk.proxy.ProxyGenerator.saveGeneratedFiles=true
// jdk8之后的设置
-Djdk.proxy.ProxyGenerator.saveGeneratedFiles=true
属性名的确定 可以查看 ProxyGenerator 类的 saveGeneratedFiles 属性
private static final boolean saveGeneratedFiles = (Boolean)AccessController.doPrivileged(new GetBooleanAction("sun.misc.ProxyGenerator.saveGeneratedFiles"));
private static final boolean saveGeneratedFiles = (Boolean)AccessController.doPrivileged(new GetBooleanAction("jdk.proxy.ProxyGenerator.saveGeneratedFiles"));
项目启动后在工程根目录的 com.sun.proxy 包路径下, 创建了动态代理生成的.class文件
$Proxy0.class
$Proxy1.class
$Proxy2.class
...
2. 找到 class 文件
这么多Proxy哪个是我想要的?
-
调用 debug
查看代理类的类型和地址
allocationClient{$Proxy211@18899}Proxy211 是我想要的
-
打印获取
获取代理类名称
package java.lang.reflect;
Proxy.getProxyClass(AllocationClient.class.getClassLoader(), AllocationClient.class).getName()
// 结果
com.sun.proxy.$Proxy211
- 条件 debug
package sun.misc;
ProxyGenerator.generateProxyClass
// 条件断点
var1[0].getSimpleName().contains("AllocationClient")
// 看 var2 path
3. 编译与反编译
-
javac
- . java文件编译为 * .class文件(字节码文件)
-
javap
字节码文件到汇编语言
javac -g xx.java
javap -v xx.class
4. jd-gui 反编译为 java 文件
下载jd-gui 的jar包,然后执行
java -jar jd-gui-1.6.6.jar
打开需要反编译的 class 文件就可以查看了!
5. reference
- https://blog.csdn.net/MrYushiwen/article/details/111473126
- http://java-decompiler.github.io/