Arthas阿尔萨斯如何查看动态代理类代码结构
在学习动态代理时,因为动态代理的类是在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阿尔萨斯如何查看动态代理类代码结构的全部内容,有问题欢迎留言。