You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
arthas/tutorials/katacoda/command-mc-retransform-cn/retransform-more.md

63 lines
1.9 KiB
Markdown

> 加载外部的`.class`文件retransform jvm已加载的类。
参考:[Instrumentation#retransformClasses](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#retransformClasses-java.lang.Class...-)
### 查看 retransform entry
`retransform -l`{{execute T2}}
```bash
$ retransform -l
Id ClassName TransformCount LoaderHash LoaderClassName
1 com.example.dem 1 null null
o.arthas.user.U
serController
```
* TransformCount 统计在 ClassFileTransformer#transform 函数里尝试返回 entry对应的 .class文件的次数但并不表明transform一定成功。
### 删除指定 retransform entry
`retransform -d 1`{{execute T2}}
需要指定 id
```bash
retransform -d 1
```
### 删除所有 retransform entry
`retransform --deleteAll`{{execute T2}}
```bash
retransform --deleteAll
```
### 显式触发 retransform
`retransform --classPattern com.example.demo.arthas.user.UserController`{{execute T2}}
```bash
$ retransform --classPattern com.example.demo.arthas.user.UserController
retransform success, size: 1, classes:
com.example.demo.arthas.user.UserController
```
> 注意:对于同一个类,当存在多个 retransform entry时如果显式触发 retransform 则最后添加的entry生效(id最大的)。
### 消除 retransform 的影响
如果对某个类执行 retransform 之后,想消除影响,则需要:
* 删除这个类对应的 retransform entry
* 重新触发 retransform
> 如果不清除掉所有的 retransform entry并重新触发 retransform 则arthas stop时retransform过的类仍然生效。
在上面删掉 retransform entry再显式触发 retransform之后可以用 `jad`命令来确认之前retransform的结果已经被消除了。
再次访问 https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/0 ,会抛出异常。