|
29 | 29 | import org.graalvm.nativeimage.ImageInfo; |
30 | 30 | import org.junit.Assert; |
31 | 31 |
|
| 32 | +import java.lang.classfile.ClassFile; |
| 33 | +import java.lang.classfile.ClassModel; |
| 34 | +import java.lang.classfile.MethodModel; |
32 | 35 | import java.lang.instrument.ClassFileTransformer; |
33 | 36 | import java.lang.instrument.Instrumentation; |
34 | 37 | import java.security.ProtectionDomain; |
35 | 38 | import java.util.Collections; |
36 | 39 | import java.util.Set; |
37 | | -import jdk.internal.org.objectweb.asm.ClassReader; |
38 | | -import jdk.internal.org.objectweb.asm.ClassWriter; |
39 | | -import jdk.internal.org.objectweb.asm.ClassVisitor; |
40 | | -import jdk.internal.org.objectweb.asm.MethodVisitor; |
41 | | -import jdk.internal.org.objectweb.asm.Opcodes; |
42 | 40 |
|
43 | 41 | public class TestJavaAgent1 { |
44 | 42 |
|
45 | 43 | public static void premain( |
46 | | - String agentArgs, Instrumentation inst) { |
| 44 | + String agentArgs, Instrumentation inst) { |
47 | 45 | AgentPremainHelper.parseOptions(agentArgs); |
48 | 46 | System.setProperty("instrument.enable", "true"); |
49 | 47 | AgentPremainHelper.load(TestJavaAgent1.class); |
@@ -146,40 +144,29 @@ static class DemoTransformer implements ClassFileTransformer { |
146 | 144 |
|
147 | 145 | @Override |
148 | 146 | public byte[] transform( |
149 | | - ClassLoader loader, |
150 | | - String className, |
151 | | - Class<?> classBeingRedefined, |
152 | | - ProtectionDomain protectionDomain, |
153 | | - byte[] classfileBuffer) { |
| 147 | + ClassLoader loader, |
| 148 | + String className, |
| 149 | + Class<?> classBeingRedefined, |
| 150 | + ProtectionDomain protectionDomain, |
| 151 | + byte[] classfileBuffer) { |
154 | 152 | if (internalClassName.equals(className)) { |
155 | | - ClassReader cr = new ClassReader(classfileBuffer); |
156 | | - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); |
157 | | - |
158 | | - ClassVisitor cv = new ClassVisitor(Opcodes.ASM9, cw) { |
159 | | - @Override |
160 | | - public MethodVisitor visitMethod(int access, String name, String descriptor, |
161 | | - String signature, String[] exceptions) { |
162 | | - MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); |
163 | | - if ("getCounter".equals(name) && "()I".equals(descriptor)) { |
164 | | - return new MethodVisitor(api, mv) { |
165 | | - @Override |
166 | | - public void visitInsn(int opcode) { |
167 | | - if (opcode == Opcodes.IRETURN) { |
168 | | - super.visitLdcInsn(11); |
169 | | - } |
170 | | - super.visitInsn(opcode); |
171 | | - } |
172 | | - }; |
173 | | - } |
174 | | - return mv; |
| 153 | + ClassFile classFile = ClassFile.of(); |
| 154 | + ClassModel classModel = classFile.parse(classfileBuffer); |
| 155 | + |
| 156 | + return classFile.transformClass(classModel, (classbuilder, ce) -> { |
| 157 | + if (ce instanceof MethodModel mm && mm.methodName().equalsString("getCounter") |
| 158 | + && mm.methodType().equalsString("()I")) { |
| 159 | + classbuilder.transformMethod(mm, (mb, me) -> { |
| 160 | + mb.withCode(cb -> { |
| 161 | + cb.loadConstant(11); |
| 162 | + cb.ireturn(); |
| 163 | + }); |
| 164 | + }); |
| 165 | + } else { |
| 166 | + classbuilder.with(ce); |
175 | 167 | } |
176 | | - }; |
177 | | - |
178 | | - cr.accept(cv, 0); |
179 | | - |
180 | | - return cw.toByteArray(); |
| 168 | + }); |
181 | 169 | } |
182 | | - |
183 | 170 | return null; |
184 | 171 | } |
185 | 172 | } |
|
0 commit comments