gpt4 book ai didi

java - ASM 树 API : Using LDC to load a Class 常量

转载 作者:行者123 更新时间:2023-11-30 08:06:12 25 4
gpt4 key购买 nike

我正在用 ASM 编写一个程序,它使用 Tree API 将字节码添加到某些方法中。我已经使用 ASMifier 生成创建特定方法所需的代码,但我在使用以下行时遇到了一些问题:

mv.visitLdcInsn(Type.getType('L' + targetClassName + ';'));

我只是将 mv 初始化为 new MethodNode,但没有加载 Class,上面的行在字节码中显示为:

ldc Lsome/test/TestClass; (org.objectweb.asm.Type)

如何让 ASM 加载 java/lang/Class 常量而不是 org.objectweb.asm.Type 常量?

如果相关,下一行字节码将是invokevirtual java/lang/Class getClassLoader(()Ljava/lang/ClassLoader;);

最佳答案

您的代码是正确的,但不是规范的解决方案。您可以将其简化为

mv.visitLdcInsn(Type.getObjectType(targetClassName));

(在 ASM 中,“对象类型”表示引用类型,另请参见 Type.getObjectType(…)the Type.OBJECT sort)。然而,结果是一样的。反汇编输出看起来像的原因

ldc Lsome/test/TestClass; (org.objectweb.asm.Type)

在于反汇编器。如果你看it’s code for converting an LDC instruction to a String :

protected String printLdcInsnNode(LdcInsnNode ldc, ListIterator<?> it) {
if (ldc.cst instanceof String)
return nameOpcode(ldc.opcode()) + " \"" + StringEscapeUtils.escapeJava(ldc.cst.toString()) + "\" (" + ldc.cst.getClass().getCanonicalName() + ")";

return nameOpcode(ldc.opcode()) + " " + StringEscapeUtils.escapeJava(ldc.cst.toString()) + " (" + ldc.cst.getClass().getCanonicalName() + ")";
}

您会看到它将打印存储在 LdcInsnNode 中的对象实例的类型,而不是代码最终将在运行时生成的类型。对于 String,这就足够了,因为它是同一类型,对于原语,它将打印相应的包装器类型,但对于 TypeHandle对象,此反汇编程序将向您显示这些 ASM 特定类,而不是相应的运行时类 java.lang.Classjava.lang.invoke.MethodTypejava. lang.invoke.MethodHandleldc 指令实际上会将其压入操作数栈。

关于java - ASM 树 API : Using LDC to load a Class<? > 常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34550653/

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