2015-01-15 2 views
0

В настоящее время я изучаю байт-код Java, и я застрял на части.Приращение значения Java Fied с использованием Objectweb ASM Bytecode

Допустим, у меня есть суперкласс, который содержит целое число currentPos. Я сгенерировал метод, который должен сгенерировать дочерний класс и приращения currentPos, но каким-то образом он бросает ошибку стека стека.

Вот мой код:

runMethod.instructions.add(new FieldInsnNode(GETFIELD, "me/looka/bfc/FooSuperClass", "currentPos", "I")); 
runMethod.instructions.add(new InsnNode(ICONST_1)); 
runMethod.instructions.add(new InsnNode(IADD)); 
runMethod.instructions.add(new FieldInsnNode(PUTFIELD, "me/looka/bfc/FooSuperClass", "currentPos", "I")); 

Это должно увеличивать currentPos права, как она проходит через следующие этапы: Put текущего значения в стек Прибавить значение 1 в стек Добавить оба добавлены значения вместе , вытащите эти 2 значения из стека и добавьте добавленное значение. Установите в поле с текущим значением стека Pop, который добавил значение

+2

Вставьте свой код в свой вопрос, а не ссылку на него. – Michael

+0

Ничего, я исправил код, добавив два кода кода ALOAD_0 в начале кода. Таким образом, GETFIELD вызывается, тогда происходит приращение, потому что есть еще один ALOAD_0, который позволит установить это поле. – lucamasira

ответ

1

getfield/putfield используются для не-статических полей. Если поле статично, вам нужно getstatic/putstatic. В противном случае вам нужно предоставить объект для ссылки на поля. Предполагая, что указанный объект находится в локальном слоте 0 (где этот параметр обычно сохраняется), вам нужно что-то вроде

runMethod.instructions.add(new VarInsnNode(ALOAD, 0)); 
runMethod.instructions.add(new VarInsnNode(ALOAD, 0)); 
runMethod.instructions.add(new FieldInsnNode(GETFIELD, "me/looka/bfc/FooSuperClass", "currentPos", "I")); 
runMethod.instructions.add(new InsnNode(ICONST_1)); 
runMethod.instructions.add(new InsnNode(IADD)); 
runMethod.instructions.add(new FieldInsnNode(PUTFIELD, "me/looka/bfc/FooSuperClass", "currentPos", "I"));