dim*_*zon 6 java bytecode java-bytecode-asm
我正在尝试生成字节码,它将创建没有代码初始化逻辑的对象实例.其实我想重现generateSerializationConstructor行为.
{
mv = cw.visitMethod(ACC_PUBLIC, "newObjectInstance", "()Ljava/lang/Object;", null, null);
mv.visitCode();
mv.visitTypeInsn(NEW, classNameInternal);
mv.visitInsn(DUP);
classNameInternal = "java/lang/Object";
mv.visitMethodInsn(INVOKESPECIAL, classNameInternal, "<init>", "()V");
mv.visitInsn(ARETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是我得到了这样的错误:
java.lang.VerifyError :(类:com/esotericsoftware/reflectasm/benchmark/ConstructorAccessBenchmark $ SomeClass_ ClassAccess _,方法:newObjectInstance签名:()Ljava/lang/Object;)调用错误的初始化方法
JVM规范禁止在不调用正确构造函数的情况下创建对象.但是,有两种棘手的方法可以做到这一点.它们都特定于OpenJDK/Oracle JDK,并不保证可以在所有Java实现上使用.
这两种技术都在我们的自定义序列化引擎中使用,可以在https://github.com/odnoklassniki/one-nio/blob/master/src/one/nio/serial/找到