ClassFile API:字节码操纵的现代方式
使用Java 22的ClassFile API(JEP 466)替代ASM/Javassist,在编译时或运行时修改类定义,构建自定义AOP框架。 · 难度:入门 · +10XP
告别ASM:标准ClassFile API修改字节码
之前Java字节码操作通常依赖第三方库ASM。JEP 466提供了标准API来解析和生成.class文件,具有不可变性且与JDK版本同步。本课演示如何通过ClassFile.of()读取类文件,添加方法、修改注解,甚至创建新的内部类。重点讲解CodeBuilder的使用,以及如何使用StackMapTable避免验证错误。最后实现一个简单的@Logging注解处理器,在方法前后插入打印语句。
ClassModel cm = ClassFile.of().parse(bytes);
ClassBuilder builder = ClassFile.of().buildClass(cm.thisClass().asSymbol(),
cd -> {
cd.withMethod("newMethod", MethodType.methodType(void.class),
mb -> mb.withCode(code -> code.aload(0)
.invokevirtual(ClassDesc.of("java.io.PrintStream"),
"println", MethodType.methodType(void.class, String.class))
.return_()));
});
byte[] newBytes = builder.toByteArray();