Skip to content

Commit 8dff938

Browse files
committed
Create addTransformer与redefineClasses用法学习
1 parent 262b0bc commit 8dff938

3 files changed

Lines changed: 116 additions & 0 deletions

File tree

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# addTransformer与redefineClasses用法学习
2+
3+
## addTransformer
4+
5+
6+
7+
首先实现一个字节码替换的玩具
8+
9+
10+
11+
```Java
12+
package com.yyds;
13+
14+
public class TransClass {
15+
public int getNumber() {
16+
return 1;
17+
}
18+
}
19+
20+
```
21+
22+
将retrun改为2之后实例化运行,并改类名
23+
24+
```Java
25+
package com.yyds;
26+
27+
public class MyAgentTest {
28+
public static void main(String[] args) {
29+
System.out.println(new TransClass().getNumber());
30+
}
31+
}
32+
33+
```
34+
35+
![](img/1.png)
36+
37+
之后写一个Transformer类
38+
39+
```Java
40+
package com.yyds;
41+
42+
import javassist.CannotCompileException;
43+
import javassist.ClassPool;
44+
import javassist.NotFoundException;
45+
46+
import java.io.ByteArrayOutputStream;
47+
import java.io.File;
48+
import java.io.FileInputStream;
49+
import java.io.IOException;
50+
import java.lang.instrument.ClassFileTransformer;
51+
import java.lang.instrument.IllegalClassFormatException;
52+
import java.security.ProtectionDomain;
53+
54+
public class Transformer implements ClassFileTransformer {
55+
public static final String classNumberReturns2 = "E:\\testJar\\target\\classes\\com\\yyds\\TransClass.class.2";
56+
57+
public static byte[] getBytesFromFile(String fileName) throws Exception{
58+
FileInputStream fileInputStream = new FileInputStream(new File("E:\\testJar\\target\\classes\\com\\yyds\\TransClass.class.2"));
59+
int a;
60+
byte[] bytes = new byte[1024];
61+
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
62+
while ((a=fileInputStream.read(bytes))!= -1){
63+
outputStream.write(bytes,0,a);
64+
}
65+
return outputStream.toByteArray();
66+
}
67+
68+
@Override
69+
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {
70+
if (!className.equals("com/yyds/TransClass")) {
71+
return null;
72+
}
73+
try {
74+
return getBytesFromFile(classNumberReturns2);
75+
} catch (Exception e) {
76+
e.printStackTrace();
77+
}
78+
return null;
79+
}
80+
}
81+
```
82+
83+
以及MyAgent,按上一篇文章生成jar后用-javaagent运行最后
84+
85+
86+
87+
```Java
88+
package com.yyds;
89+
90+
import java.lang.instrument.Instrumentation;
91+
92+
public class MyAgent {
93+
public static void premain(String args, Instrumentation inst) throws Exception {
94+
inst.addTransformer(new Transformer());
95+
}
96+
}
97+
```
98+
99+
最后结果不是1是2
100+
101+
![](img/2.png)
102+
103+
## redefineClasses
104+
105+
redefineClasses也是差不多
106+
107+
```java
108+
public class MyAgent {
109+
public static void premain(String agentArgsInstrumentation inst) throws ClassNotFoundExceptionUnmodifiableClassException {
110+
ClassDefinition def = new ClassDefinition(TransClass.class, Transformer.getBytesFromFile(Transformer.classNumberReturns2));
111+
inst.redefineClasses(new ClassDefinition[] { def });
112+
System.out.println("success");
113+
}
114+
}
115+
```
116+
30.9 KB
Loading
72 KB
Loading

0 commit comments

Comments
 (0)