有没有一种方法在运行时获取类的字节码?

16

在Java中,是否有一种方法(在运行时)可以获取定义特定类的字节码?

换句话说,是否有一种方法可以获取加载特定类时传递给ClassLoader.defineClass(String name, byte[] b, int off, int len)byte[] 数组?我发现这个方法声明为final,因此创建一个自定义的ClassLoader来拦截类定义似乎不可行。

过去,我使用类的ClassLoader通过getResourceAsStream(String)方法获取字节码,但我希望有一个更加规范的解决方案。


为什么<code>getResourceAsStream(String)</code>不是规范的? - Riduidel
2
@Riduidel:并非所有的类加载器都将字节码公开为资源。例如,一些自定义类加载器会即时生成字节码,并在调用getResourceAsStream时不返回它。 - Adam Paynter
这可能是一个愚蠢的问题,但为什么需要获取给定类的字节码?大概是因为您不想使用getResourceAsStream,因为有些类可能会被另一个类加载器加载? - Geoff
@Geoff: 我实际上希望使用调试符号,在运行时帮助推断方法参数的名称,如此问题所述:https://dev59.com/o3E85IYBdhLWcg3whUBr - Adam Paynter
@Geoff:过去,我使用类的类加载器(而不是当前线程的类加载器或系统类加载器)来增加找到字节码的几率。 :) - Adam Paynter
2个回答

9

Here is a description how to implement an agent


5
"Java代理"可能是显而易见的解决方案。

有趣,我以前从未听说过代理! - Adam Paynter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接