Создание нового поля с asm 4

Это код, который я использую

    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 (неизвестный источник)


person clienthax    schedule 22.09.2013    source источник


Ответы (1)


Вы не можете передать объект в качестве начального значения. Вам нужно сгенерировать код, который создаст объект при запуске кода, а не при его создании.

person Peter Lawrey    schedule 22.09.2013
comment
Как бы я это сделал?, я новичок в asm - person clienthax; 23.09.2013
comment
Я предлагаю вам написать код на Java и использовать ASMifier для создания дампа кода для его повторной генерации. Вы также можете использовать asm.ow2.org/eclipse или подключаемый модуль IntelliJ, чтобы увидеть код в Вы едете. - person Peter Lawrey; 23.09.2013
comment
Ага, очень полезно, спасибо! - person clienthax; 23.09.2013
comment
Вы можете передать ограниченный набор типов объектов в качестве начального значения: Integer, Byte, Character, Short, Boolean, Float, Long, Double, String и Type. Последний является частью библиотеки ASM. - person Jonas Berlin; 17.10.2013