ASM的TreeApi 对于Method的转换、生成也提供了一系列的组件和接口。
可以用它来动态修改一些字节码,达到aop的思想。也可用来做java的探针机制。
以下使用它来动态修改了方法。达到注入了一些逻辑。
package test.asm.inteceptor;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.*;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import static org.objectweb.asm.Opcodes.GETSTATIC;
import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
public class ASMTEST extends ClassLoader {
public static void main(String[] args) throws Exception {
ASMTEST asmtest = new ASMTEST();
ClassReader reader = new ClassReader(Test11.class.getName());
ClassNode node = new ClassNode();
reader.accept(node, 0);
asmtest.modityMethod(node);
//0 为自己计算 推荐自己计算长度,而不依赖asm本身的。否则性能开销有点大
ClassWriter writer = new ClassWriter(reader, 0);
node.accept(writer);
byte[] bytes = writer.toByteArray();
File file = new File("D://" + node.name + ".class");
FileOutputStream fout = new FileOutputStream(file);
fout.write(bytes);
fout.flush();
fout.close();
Class<?> aClass = asmtest.defineClass(null, bytes, 0, bytes.length);
Method test = aClass.getMethod("testLocalVariable");
test.invoke(aClass.newInstance());
}
private static void createMethodLocalVariable(MethodNode method