文
章
目
录
章
目
录
在学习动态代理时,因为动态代理的类是在jav程序运行期间在JVM内存动态生成的一个类,我们如果想要查看该代理的代码结构,该如何去实现呢?我们可以借助Arthas阿尔萨斯这个工具,那么Arthas阿尔萨斯如何查看动态代理类代码结构?我们一起来看下吧。
关于Arthas工具的详细介绍及使用方法可以直接参考官网即可,它是阿里巴巴开源的一个java诊断工具:官网教程
前期准备
1)准备Arthas工具包arthas-boot.jar
首先我们要下载Arthas工具的jar包,我们这里只需要下载arthas-boot.jar,可以到阿里云maven仓库arthas-boot下载,搜索即可下载。如果你想下载全量包可以去官网下载
2)准备演示代码
我们这里只演示下如何使用该工具来查看动态代理类的结构,首先我们的案例基于JDK的动态代理,案例代码如下:
//卖票接口
public interface SellTickets {
void sell();
}
//火车站 火车站具有卖票功能,所以需要实现SellTickets接口
public class TrainStation implements SellTickets {
public void sell() {
System.out.println("火车站卖票");
}
}
//代理工厂,用来创建代理对象
public class ProxyFactory {
private TrainStation station = new TrainStation();
public SellTickets getProxyObject() {
//使用Proxy获取代理对象
/*
newProxyInstance()方法参数说明:
ClassLoader loader : 类加载器,用于加载代理类,使用真实对象的类加载器即可
Class<?>[] interfaces : 真实对象所实现的接口,代理模式真实对象和代理对象实现相同的接口
InvocationHandler h : 代理对象的调用处理程序
*/
SellTickets sellTickets = (SellTickets) Proxy.newProxyInstance(station.getClass().getClassLoader(),
station.getClass().getInterfaces(),
new InvocationHandler() {
/*
InvocationHandler中invoke方法参数说明:
proxy : 代理对象
method : 对应于在代理对象上调用的接口方法的 Method 实例
args : 代理对象调用接口方法时传递的实际参数
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理点收取一些服务费用(JDK动态代理方式)");
//执行真实对象
Object result = method.invoke(station, args);
return result;
}
});
return sellTickets;
}
}
//测试类
public class Client {
public static void main(String[] args) {
//获取代理对象
ProxyFactory factory = new ProxyFactory();
SellTickets proxyObject = factory.getProxyObject();
proxyObject.sell();
//打印生成的动态代理类名称
System.out.println(proxyObject.getClass());
//死循环保证JVM中的代理类不释放
while(true){}
}
}
查看动态代理类代码结构
1)然后,我们运行上面的案例代码,这里我们运行出的代理类名称为:com.sun.proxy.$Proxy0,由于死循环,该代码保持一直运行。
2)打开cmd,进入到arthas-boot.jar所在目录,使用如下指令运行arthas工具(如果你jar有版本号,带上版本号):
java -jar arthas-boot.jar
3)这时我们发现编号【2】就是对应我们运行的测试类Client类,然我们直接输入2回车,效果如下:

4)使用如下指令查看代理类的代码结构:
jad com.sun.proxy.$Proxy0
jad后跟上我们上面输出的全路径类名,然后回车,效果如下:

这样就会把内存中的代理类的代码结构打印出来了。
以上就是Arthas阿尔萨斯如何查看动态代理类代码结构的全部内容,有问题欢迎留言。






