运行时字节码生成:用ASM框架动态创建类与方法
不依赖javac,直接在内存中构造字节码并加载,实现AOP与代理。 · 难度:入门 · +10XP
运行时字节码生成:用ASM框架动态创建类与方法
虽然Spring等框架隐藏了字节码细节,但掌握ASM可让你实现极致的性能优化。本教程从零使用ClassWriter构建一个简单的Bean类,添加字段、getter/setter以及构造方法。然后通过MethodVisitor注入方法体字节码(如算术运算)。最后使用自定义ClassLoader加载生成的byte[]并反射调用。理解类文件格式与常量池概念。
import org.objectweb.asm.*;
public class AsmBuilder {
public static byte[] createClass() {
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
cw.visit(Opcodes.V11, Opcodes.ACC_PUBLIC, "com/example/Dynamic",
null, "java/lang/Object", null);
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
cw.visitEnd();
return cw.toByteArray();
}
}