import{_ as l,o as p,c as i,a as n,b as a,w as c,e as s,d,r as o}from"./app.4d248835.js";const r={},u=n("h1",{id:"redefine",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#redefine","aria-hidden":"true"},"#"),s(" redefine")],-1),m={class:"custom-container tip"},k=n("p",{class:"custom-container-title"},"\u63D0\u793A",-1),v=s("\u63A8\u8350\u4F7F\u7528 "),h=s("retransform"),b=s(" \u547D\u4EE4"),f={href:"https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=command-mc-redefine",target:"_blank",rel:"noopener noreferrer"},_=n("code",null,"mc-redefine",-1),g=s("\u5728\u7EBF\u6559\u7A0B"),x=n("div",{class:"custom-container tip"},[n("p",{class:"custom-container-title"},"\u63D0\u793A"),n("p",null,[s("\u52A0\u8F7D\u5916\u90E8\u7684"),n("code",null,".class"),s("\u6587\u4EF6\uFF0Credefine jvm \u5DF2\u52A0\u8F7D\u7684\u7C7B\u3002")])],-1),y=s("\u53C2\u8003\uFF1A"),w={href:"https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#redefineClasses-java.lang.instrument.ClassDefinition...-",target:"_blank",rel:"noopener noreferrer"},j=s("Instrumentation#redefineClasses"),C=n("h2",{id:"\u5E38\u89C1\u95EE\u9898",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#\u5E38\u89C1\u95EE\u9898","aria-hidden":"true"},"#"),s(" \u5E38\u89C1\u95EE\u9898")],-1),L={class:"custom-container tip"},I=n("p",{class:"custom-container-title"},"\u63D0\u793A",-1),S=s("\u63A8\u8350\u4F7F\u7528 "),T=s("retransform"),E=s(" \u547D\u4EE4"),q=d(`
redefine \u7684 class \u4E0D\u80FD\u4FEE\u6539\u3001\u6DFB\u52A0\u3001\u5220\u9664\u7C7B\u7684 field \u548C method\uFF0C\u5305\u62EC\u65B9\u6CD5\u53C2\u6570\u3001\u65B9\u6CD5\u540D\u79F0\u53CA\u8FD4\u56DE\u503C
\u5982\u679C mc \u5931\u8D25\uFF0C\u53EF\u4EE5\u5728\u672C\u5730\u5F00\u53D1\u73AF\u5883\u7F16\u8BD1\u597D class \u6587\u4EF6\uFF0C\u4E0A\u4F20\u5230\u76EE\u6807\u7CFB\u7EDF\uFF0C\u4F7F\u7528 redefine \u70ED\u52A0\u8F7D class
\u76EE\u524D redefine \u548C watch/trace/jad/tt \u7B49\u547D\u4EE4\u51B2\u7A81\uFF0C\u4EE5\u540E\u91CD\u65B0\u5B9E\u73B0 redefine \u529F\u80FD\u4F1A\u89E3\u51B3\u6B64\u95EE\u9898
\u6CE8\u610F
\u6CE8\u610F\uFF0C redefine \u540E\u7684\u539F\u6765\u7684\u7C7B\u4E0D\u80FD\u6062\u590D\uFF0Credefine \u6709\u53EF\u80FD\u5931\u8D25\uFF08\u6BD4\u5982\u589E\u52A0\u4E86\u65B0\u7684 field\uFF09\uFF0C\u53C2\u8003 jdk \u672C\u8EAB\u7684\u6587\u6863\u3002
\u63D0\u793A
reset
\u547D\u4EE4\u5BF9redefine
\u7684\u7C7B\u65E0\u6548\u3002\u5982\u679C\u60F3\u91CD\u7F6E\uFF0C\u9700\u8981redefine
\u539F\u59CB\u7684\u5B57\u8282\u7801\u3002
\u63D0\u793A
redefine
\u547D\u4EE4\u548Cjad
/watch
/trace
/monitor
/tt
\u7B49\u547D\u4EE4\u4F1A\u51B2\u7A81\u3002\u6267\u884C\u5B8Credefine
\u4E4B\u540E\uFF0C\u5982\u679C\u518D\u6267\u884C\u4E0A\u9762\u63D0\u5230\u7684\u547D\u4EE4\uFF0C\u5219\u4F1A\u628Aredefine
\u7684\u5B57\u8282\u7801\u91CD\u7F6E\u3002 \u539F\u56E0\u662F jdk \u672C\u8EAB redefine \u548C Retransform \u662F\u4E0D\u540C\u7684\u673A\u5236\uFF0C\u540C\u65F6\u4F7F\u7528\u4E24\u79CD\u673A\u5236\u6765\u66F4\u65B0\u5B57\u8282\u7801\uFF0C\u53EA\u6709\u6700\u540E\u4FEE\u6539\u7684\u4F1A\u751F\u6548\u3002
\u53C2\u6570\u540D\u79F0 | \u53C2\u6570\u8BF4\u660E |
---|---|
[c:] | ClassLoader \u7684 hashcode |
[classLoaderClass:] | \u6307\u5B9A\u6267\u884C\u8868\u8FBE\u5F0F\u7684 ClassLoader \u7684 class name |
redefine /tmp/Test.class
redefine -c 327a647b /tmp/Test.class /tmp/Test\\$Inner.class
redefine --classLoaderClass sun.misc.Launcher$AppClassLoader /tmp/Test.class /tmp/Test\\$Inner.class
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
mc /tmp/UserController.java -d /tmp
redefine /tmp/com/example/demo/arthas/user/UserController.class
\u4F7F\u7528mc
\u547D\u4EE4\u6765\u7F16\u8BD1jad
\u7684\u53CD\u7F16\u8BD1\u7684\u4EE3\u7801\u6709\u53EF\u80FD\u5931\u8D25\u3002\u53EF\u4EE5\u5728\u672C\u5730\u4FEE\u6539\u4EE3\u7801\uFF0C\u7F16\u8BD1\u597D\u540E\u518D\u4E0A\u4F20\u5230\u670D\u52A1\u5668\u4E0A\u3002\u6709\u7684\u670D\u52A1\u5668\u4E0D\u5141\u8BB8\u76F4\u63A5\u4E0A\u4F20\u6587\u4EF6\uFF0C\u53EF\u4EE5\u4F7F\u7528base64
\u547D\u4EE4\u6765\u7ED5\u8FC7\u3002
\u5728\u672C\u5730\u5148\u8F6C\u6362.class
\u6587\u4EF6\u4E3A base64\uFF0C\u518D\u4FDD\u5B58\u4E3A result.txt
base64 < Test.class > result.txt
\u5230\u670D\u52A1\u5668\u4E0A\uFF0C\u65B0\u5EFA\u5E76\u7F16\u8F91result.txt
\uFF0C\u590D\u5236\u672C\u5730\u7684\u5185\u5BB9\uFF0C\u7C98\u8D34\u518D\u4FDD\u5B58
\u628A\u670D\u52A1\u5668\u4E0A\u7684 result.txt
\u8FD8\u539F\u4E3A.class
base64 -d < result.txt > Test.class
\u7528 md5 \u547D\u4EE4\u8BA1\u7B97\u54C8\u5E0C\u503C\uFF0C\u6821\u9A8C\u662F\u5426\u4E00\u81F4
System.out.println
\uFF0C\u53EA\u6709run()
\u51FD\u6570\u91CC\u7684\u4F1A\u751F\u6548public class MathGame {
public static void main(String[] args) throws InterruptedException {
MathGame game = new MathGame();
while (true) {
game.run();
TimeUnit.SECONDS.sleep(1);
// \u8FD9\u4E2A\u4E0D\u751F\u6548\uFF0C\u56E0\u4E3A\u4EE3\u7801\u4E00\u76F4\u8DD1\u5728 while\u91CC
System.out.println("in loop");
}
}
public void run() throws InterruptedException {
// \u8FD9\u4E2A\u751F\u6548\uFF0C\u56E0\u4E3Arun()\u51FD\u6570\u6BCF\u6B21\u90FD\u53EF\u4EE5\u5B8C\u6574\u7ED3\u675F
System.out.println("call run()");
try {
int number = random.nextInt();
List<Integer> primeFactors = primeFactors(number);
print(number, primeFactors);
} catch (Exception e) {
System.out.println(String.format("illegalArgumentCount:%3d, ", illegalArgumentCount) + e.getMessage());
}
}
}