2014-04-19 2 views
0

Я занимаюсь проблемой в отношении генерации кода с паропроводом (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 :(

+0

Просто чтобы прояснить, вы используете инструмент, который модифицирует файлы классов во время выполнения, и вы пытаетесь выяснить, как сбросить измененный файл класса? Почему бы просто не зацепить ClassLoader.defineClass? – Antimony

+0

@ Антитея не так проста; Я хочу получить доступ к этому внутреннему классу '$$'. Я могу сбросить 'Parser', но это меня не интересует – fge

+0

Ну, если вы можете как-то поймать байты и записать их в файл, вы можете использовать' javap'. В противном случае JDI определяет интерфейсы времени выполнения для получения байт-кодов, но я никогда не пытался его использовать. –

ответ

0

Хорошо хорошо, я нашел решение, но это действительно хак ...

Решения состоит в том, чтобы добавить метод, чтобы написать байт-код сгенерированного класса в файл в ParserTransformer#defineExtendedParserClass() ...

Но я бы действительно оценил менее хак решения:/

+0

Возможно, будет работать с классом ClassLoader.defineClass. Я не уверен, что вы считаете, что это более или менее хакерское. – Antimony

+0

@ Антитело меня, я только начал добровольно поддерживать этот проект и никогда не прикасался к ASM или 2. сделал расширенная загрузка классов раньше, поэтому в этот момент я даже не могу понять, о чем вы говорите;) Но я учусь медленно ... – fge

Смежные вопросы