Байт-код и объекты - PullRequest
       19

Байт-код и объекты

7 голосов
/ 07 мая 2010

Я работаю над проектом инструментовки байт-кода. В настоящее время при обработке объектов верификатор выдает ошибку большую часть времени. Поэтому я хотел бы прояснить ситуацию с правилами для объектов (я прочитал JVMS, но не смог найти ответ, который искал):

Я использую НОВУЮ инструкцию:

оригинальный байт-код

NEW <MyClass>
DUP
INVOKESPECIAL <MyClass.<init>>

после контрольно-измерительных приборов

NEW <MyClass>
DUP
INVOKESTATIC <Profiler.handleNEW>
DUP
INVOKESPECIAL <MyClass.<init>>

Обратите внимание, что я добавил вызов Profiler.handleNEW (), который принимает в качестве аргумента ссылку на объект (недавно созданный объект).

В приведенном выше фрагменте кода выдается ошибка VerificationError. Хотя, если я не добавлю INVOKESTATIC (оставляя только DUP), это не так. Так какое правило я нарушаю? Я могу дублировать неинициализированную ссылку, но не могу передать ее в качестве параметра? Буду признателен за любую помощь. Спасибо

Ответы [ 2 ]

4 голосов
/ 07 мая 2010

Верификатор JVM обрабатывает объект, конструктор которого еще не вызван, как если бы он имел специальный тип времени компиляции, называемый «неинициализированным».

Итак, с точки зрения верификатора происходит то, что вы передаете неправильный тип объекта в качестве первого параметра Profiler.handleNEW(), потому что «неинициализированный» не считается подклассом объекта (так сказать).

Соответствующая часть спецификации JVM, касающаяся определения «неинициализированного», здесь .

1 голос
/ 07 мая 2010

До тех пор, пока не будет вызван конструктор java.lang.Object (технически он, вероятно, обычно завершается), тип ссылки "неинициализирован". Таким образом, вы не можете многое сделать со ссылкой до вызова конструктора. Это также верно для конструкторов рассматриваемого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...