tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。
开头:
我们先说下生产使用频率较高的有哪些:dump、jad、mc、retransform
文章目录
- Class/Classloader相关命令使用
- classloader
- dump
- jad
- mc
- redefine
- retransform
- sc
- sm
Class/Classloader相关命令使用
classloader
查看 classloader 的继承树,urls,类加载信息,将 JVM 中所有的 classloader 的信息统计出来,并可以展示继承树,urls 等。这个命令用的不多,了解一下。
命令:
classloader 按类加载类型查看统计信息
classloader -l 按类加载实例进行统计
classloader -t 按类加载实例进行统计
classloader -c [hashcode] ClassLoader 的 hashcode
classloader -c [hashcode] --load [类名] 使用 ClassLoader 去加载类
classloader -c [hashcode] -r [资源名] 用 ClassLoader 去查找 resource
dump
dump 已加载类的 bytecode 到特定目录,这个命令比较常用,主要用来下载/打印出来 class 文件。
常用命令:
dump -d [目录] [类的全限定名]
使用截图:
jad
反编译指定已加载类的源码,这个命令也比较常用,主要用来反编译 class 文件,确定我们写的代码是不是编译了,是否生效。
命令:
jad -c [hashcode]
jad [类的全限定名] --lineNumber false 反编译类,不限行号, --lineNumber false 可选的。
mc
Memory Compiler/内存编译器,编译.java文件生成.class。这个命令也比较常用,主要用来线上修改代码后,编译发布。
我们用 jad 拿到源码,然后保存修改它,在用 mc 编译。
命令:
mc -d [目录] -c [hashcode] [目录/xxx.java]
也可以参考:mc -d /root/test --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /root/test/Test.java
有时候没指定 classloader,也会报错,如下:
使用截图如下:
redefine
加载外部的.class文件,redefine jvm 已加载的类,不过官方已经推荐使用 retransform 了。
这个了解就好了。
命令:
redefine -c [hashcode] [class文件]
redefine --classLoaderClass [classLoader] [class文件]
retransform
加载外部的.class文件,retransform jvm 已加载的类。官方推荐使用的方式。
命令:
retransform [class文件] 将 class 加载到 jvm
retransform -l 查看 retransform entry
retransform -d [id] 删除指定 retransform entry
retransform --deleteAll 删除指定 retransform entry
sc
这个是 Search-Class 的缩写, 查看 JVM 已加载的类信息。
命令:
sc -d [类的全限定名]
sc -d -f [类的全限定名] 打印出类的 Field 信息
sc -cs [返回值] [类名包含] 指定 class 的 ClassLoader#toString() 返回值
sm
查看已加载类的方法信息,是 Search-Method 的简写。
命令:
主要命令: sm -d [类的全限定名]