gpt4 book ai didi

java - 如何从我在运行时使用 ASM 动态创建的 Java 类中获取和使用类类型?

转载 作者:行者123 更新时间:2023-11-29 05:45:02 24 4
gpt4 key购买 nike

我想扩展类,获取类文字,将其用作类型参数,或强制转换为它。

我已经有了解决方法,但我仍然很好奇。

目前我可以在运行时使用 ASM 定义一个类,创建一个 Object 类型的实例并通过反射调用它的方法,但我不知道如何将它用作类类型。

诚然,编译器不知道运行时定义的类,但在这种情况下知道它,而且我认为我看到它隐藏在 ASMified .java 文件中(下面的示例) ).如何让编译器相信它在编译时确实知道类类型?

感谢您的关注,

-朱利安

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();
}
}

最佳答案

你不能在编译时使用一个在编译时不存在的类。你能做的是

  • 使用在编译时存在但在运行时被所需实现替换的类或接口(interface)。
  • 使用编译时可用但仅在运行时实现的接口(interface)。
  • 使用反射在运行时调用构造函数/方法。

关于java - 如何从我在运行时使用 ASM 动态创建的 Java 类中获取和使用类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16136095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com