【发布时间】:2018-03-19 13:46:25
【问题描述】:
我试图了解在 Java 中如何将引用存储到 Object[] 中。所以我生成了一个Class 和ASM 库,如下所示:
public static Class<?> getKlass(){
String className = "TestClass";
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
classWriter.visit(V1_8, ACC_PUBLIC, className, null, getInternalName(Object.class), null);
MethodVisitor mv = classWriter.visitMethod(ACC_PUBLIC + ACC_STATIC, "m", "()[Ljava/lang/Object;",null, null);
//ARRAY_SIZE
mv.visitInsn(ICONST_1);
mv.visitTypeInsn(ANEWARRAY, getInternalName(Object.class));
mv.visitInsn(DUP);
mv.visitInsn(ICONST_0);
mv.visitTypeInsn(NEW, getInternalName(Object.class));
mv.visitInsn(AASTORE); // <--- Here is the problem
mv.visitInsn(ARETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
return new ByteArrayClassLoader().defineClass(classWriter.toByteArray());
}
当我运行这段代码时,JVM 用java.lang.VerifyError 发出信号
Type uninitialized 6 (current frame, stack[3]) is not assignable to 'java/lang/Object'
添加构造函数调用按预期工作
mv.visitTypeInsn(NEW, getInternalName(Object.class));
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, getInternalName(Object.class), "<init>", "()V", false);
mv.visitInsn(AASTORE);
现在它工作正常。但行为尚不清楚。我希望未初始化和已初始化的对象具有相同的类型。正如JVMS 中所指定的,我们没有特殊的未初始化类型。所以我希望 JVM 允许加载带有未初始化引用的类。
我错过了什么?
【问题讨论】: