【问题标题】:Creating a new field with asm 4使用 asm 4 创建一个新字段
【发布时间】:2013-09-22 21:52:37
【问题描述】:

这是我正在使用的代码

    String fieldName = "lock";
    String fieldType = "Ljava/util/concurrent/locks/Lock;";
    Object initValue = new ReentrantLock();

    cw.visitField(ACC_PUBLIC, fieldName, fieldType, null, initValue).visitEnd();

我试图添加一行“Lock lock = new ReentrantLock();” 但是 asm 报错了

线程“主”java.lang.IllegalArgumentException 中的异常:值类 java.util.concurrent.locks.ReentrantLock 在 org.objectweb.asm.ClassWriter.a(未知来源)

【问题讨论】:

    标签: java java-bytecode-asm


    【解决方案1】:

    您不能将对象作为初始值传递。您需要生成将在代码运行时创建对象的代码,而不是在您生成代码时。

    【讨论】:

    • 我该怎么做?我是 asm 新手
    • 我建议你用 Java 编写代码并使用 ASMifier 转储代码以重新生成它。您还可以使用asm.ow2.org/eclipse 或 IntelliJ 插件查看 IDE 中的代码。
    • 啊哈,很有帮助,谢谢!
    • 可以传递一组有限的对象类型作为初始值:Integer、Byte、Character、Short、Boolean、Float、Long、Double、String 和 Type。最后一个是 ASM 库的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2011-09-02
    相关资源
    最近更新 更多