Arthas学习三(class/classloader相关命令)

sc(Search Class)

这个命令能搜索出所有已经加载到JVM中的Class信息。
sc默认开启了子类匹配功能,所有当前类的子类也会被搜索出来,想要精确的匹配,将options disable-sub-class true开启

参数说明
class-pattern: 类名表达式匹配,支持全限定名,如com.taobao.test.AAA, 也支持com/taobao/test/AAA这样的格式。
method-pattern: 方法名表达式匹配
-d: 输出类的详细信息
-E: 开启正则表达式匹配
-f:输出当前类的成员变量信息,需要配合-d一起使用

例:
输出MathGame类的详细信息,成员变量信息也一并输出
sc MathGame -d -f

sm(Search Method)

查看已加载类的方法信息,只能看到当前类所声明的方法,无法看到父类的。

参数说明:
class-pattern: 类名匹配表达式
method-pattern: 方法名匹配表达式
-d: 展示每个方法的详细信息
-E: 开启正则表达式匹配,默认为通配符匹配

例:
sm -d java.lang.String

jad

jad命令将JVM中运行的字节码反编译成java代码。

参数说明:
class-pattern: 类名表达式匹配
-E: 开启正则表达式匹配,默认为通配符匹配
--source-only:  只显示源码,可以结合mc/redefine命令一起使用

例:
反编译String类下的trim()方法
jad java.lang.String trim

mc

把源代码编译成字节码

将/root/HelloWorld.java编译HelloWorld.class,并保存到内存中
mc /root/HelloWorld.java

可以通过-d命令指定输出目录
mc -d /root/bbb /root/HelloWorld.java

redefine

把新生成的字节码文件在内存中执行

可以通过jad+mc+redefine命令,直接修改源代码并执行
1.使用jad反编译MathGame,输出到/root/MathGame.java中
jad --source-only demo.MathGame > /root/MathGame.java
2.对源代码进行修改,然后使用mc将修改后的代码编译到/root/MathGame.class
mc /root/MathGame.java -d /root
3.使用redefine命令重新加载新的字节码
redefine /root/demo/MathGame.class

dump

将已加载类的字节码文件保存到特定目录,默认保存路径:logs/arthas/classdump

选项说明:
-E: 开启正则表达式匹配

把String类的字节码文件保存到~/logs/arthas/classdump目录下
dump java.lang.String
把demo包下所有类的字节码文件保存到~/logs/arthas/classdump/目录下
dump demo.*

classloader

获取类加载器的信息

  • 1.显示所有类加载器的信息
  • 2.获取某个类加载器所在的jar包
  • 3.获取某个资源在哪个jar包
  • 4.加载某个类
基本用法:
classloader 

参数说明:
-l: 按类加载实例进行统计
-t: 打印所有ClassLoader的继承树
-a: 列出所有ClassLoader加载的类,谨慎使用
-c: 先通过classloader -l获取类加载器的hashcode,然后再使用classloader -c hashcode,找到类加载器所在的jar包
-r: 获取资源在哪个jar包,例如 calssloader -r java/lang/String.class
-load: 使用类加载器加载指定的类到方法区中,例如,classloader -load java.lang.String
image.png

你可能感兴趣的:(Arthas学习三(class/classloader相关命令))