我想扩展类,获取类文字,将其用作类型参数,或者转换为类。
我已经有了一个解决方法,但我仍然很好奇。
目前我可以在运行时使用ASM定义一个类,使用Object
类型创建一个实例并使用反射调用它的方法,但我不知道如何将它用作类类型。
当然,编译器不知道在运行时定义的类,但在这种情况下 I 知道它,我认为我看到它隐藏在ASMified .java文件中(下面的例子) )。如何说服编译器在编译时实际 知道类类型?
谢谢你看看,
-Julian
ASMified类B的示例:欺骗class B{String hello = "Hello B!"}
的字节码生成代码:
import java.util.*;
import org.objectweb.asm.*;
//import org.objectweb.asm.attrs.*;
public class BDump implements Opcodes {
public static byte[] dump () throws Exception {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;
cw.visit(V1_6, ACC_SUPER, "B", null, "java/lang/Object", null);
{
fv = cw.visitField(0, "hello", "Ljava/lang/String;", null, null);
fv.visitEnd();
}
{
mv = cw.visitMethod(0, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
mv.visitVarInsn(ALOAD, 0);
mv.visitLdcInsn("Hello B!");
mv.visitFieldInsn(PUTFIELD, "B", "hello", "Ljava/lang/String;");
mv.visitInsn(RETURN);
mv.visitMaxs(2, 1);
mv.visitEnd();
}
cw.visitEnd();
return cw.toByteArray();
}
}
答案 0 :(得分:3)
在编译时不能使用编译时不存在的类。你能做的是