如何转储ASM生成的类的字节码?

时间:2014-04-19 00:31:50

标签: java classloader bytecode

我正在处理有关使用parboiled(link to the issue)生成代码的问题。

问题是这个bug似乎不在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()生成。

如何访问/转储此字节码到文件?

编辑:好的,更确切地说,当你这样做时:

Parser<?> parser = Parboiled.createParser(Parser.class);

parser的类型为Parser$$parboiled。我试过.getClass(),但我无法获得InputStream :(

1 个答案:

答案 0 :(得分:0)

好吧,我找到了一个解决方案,但它确实是个hackish ......

解决方案是添加一个方法将生成的类'字节代码写入ParserTransformer#defineExtendedParserClass()中的文件...

但我真的很感激一种不那么强硬的解决方案:/