Arthas阿尔萨斯如何查看动态代理类代码结构

Java工具 潘老师 2年前 (2022-06-03) 1376 ℃ (0) 扫码查看

在学习动态代理时,因为动态代理的类是在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

效果类似如下:
指令运行arthas工具

3)这时我们发现编号【2】就是对应我们运行的测试类Client类,然我们直接输入2回车,效果如下:

4)使用如下指令查看代理类的代码结构:

jad com.sun.proxy.$Proxy0

jad后跟上我们上面输出的全路径类名,然后回车,效果如下:
jad指令查看代理类源码
这样就会把内存中的代理类的代码结构打印出来了。

以上就是Arthas阿尔萨斯如何查看动态代理类代码结构的全部内容,有问题欢迎留言。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/5003.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】