我开始使用 asm 在运行时生成类。我从一个非常简单的类开始,它只有一个 String 字段和一个 getter。
ClassWriter cw = new ClassWriter(0);
String Name = "Sample";
cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC ,
Name, null,"java/lang/Object",
new String[] {});
cw.visitField(Opcodes.ACC_PRIVATE, "punit", "Ljava/lang/String;",
null, "sac").visitEnd();
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "getUnit",
"()Ljava/lang/String;", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, destinationName+"Configuration", "unit", "Ljava/lang/String;");
mv.visitInsn(Opcodes.ARETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
cw.visitEnd();
byte[] b = cw.toByteArray();
创建字节数组后,我创建了一个自定义类加载器并调用它的 defineClass 方法来获取 Class 对象。
然后我在这个对象上调用 newInstance() 但我得到了一个 InstantiationException。当我调试代码时,我发现它没有为新创建的类找到构造函数!
我也应该为该类生成一个构造函数吗?