Я занимаюсь проблемой в отношении генерации кода с паропроводом (link to the issue).Как сбросить байт-код генерируемого класса ASM?
Проблема заключается в том, что ошибка, кажется, не в самом Parser
классе, но в байткод, порожденного пропаренного для своих правил и один, в частности, в начале StackTrace, кажется, указывает:
at org.parboiled.matchers.ProxyMatcher.label(ProxyMatcher.java:156)
at repro.abc.Parser$$parboiled.R33(Unknown Source)
at repro.abc.Parser.R32(Parser.java:239)
at repro.abc.Parser$$parboiled.R32(Unknown Source)
Проблема заключается в том, что метод R33
сгенерированного класса repro.abc.Parser$$parboiled
. И я не могу найти способ сбросить это :(
Я могу .getResourceAsStream("/repro/abc/Parser.class")
без проблем, но, конечно, не содержит код, который меня интересует, который генерируется Parboiled.createParser()
.
Как я доступ/дамп этот байт-код в файл
EDIT: OK, чтобы быть более точным, когда вы делаете:
Parser<?> parser = Parboiled.createParser(Parser.class);
parser
имеет тип Parser$$parboiled
Я попытался .getClass()
, но я. не может получить InputStream
:(
Просто чтобы прояснить, вы используете инструмент, который модифицирует файлы классов во время выполнения, и вы пытаетесь выяснить, как сбросить измененный файл класса? Почему бы просто не зацепить ClassLoader.defineClass? – Antimony
@ Антитея не так проста; Я хочу получить доступ к этому внутреннему классу '$$'. Я могу сбросить 'Parser', но это меня не интересует – fge
Ну, если вы можете как-то поймать байты и записать их в файл, вы можете использовать' javap'. В противном случае JDI определяет интерфейсы времени выполнения для получения байт-кодов, но я никогда не пытался его использовать. –