【发布时间】:2010-04-29 12:36:10
【问题描述】:
在 Java 中,有没有办法(在运行时)获取定义特定类的字节码?
换句话说,有没有办法在加载特定类时获取传递给ClassLoader.defineClass(String name, byte[] b, int off, int len) 的byte[] 数组?我看到这个方法被声明为final,所以创建一个自定义的ClassLoader 来拦截类定义似乎是不可能的。
过去我使用类的ClassLoader通过getResourceAsStream(String)方法获取字节码,但我更喜欢更规范的解决方案。
【问题讨论】:
-
为什么
getResourceAsStream(String)不规范? -
@Riduidel:并非所有类加载器都将字节码作为资源公开。例如,一些自定义类加载器即时生成字节码,并且在调用
getResourceAsStream时不会费心返回它。 -
这可能是一个愚蠢的问题,但是为什么需要获取给定类的字节码呢?大概你不想使用 getResourceAsStream 因为某些类可能被另一个类加载器加载?
-
@Geoff:我实际上希望调试符号根据这个问题在运行时帮助推断方法参数名称:stackoverflow.com/questions/2729580
-
@Geoff:过去,我使用 class 的 类加载器(而不是当前线程的类加载器或系统类加载器)来增加找到字节码。 :)