获取由 boostrap class 加载程序加载的 class 的字节?
Obtain the bytes of a class loaded by the boostrap class loader?
我想知道是否可以获取由 bootstrap class 加载程序加载的 class 的字节。我到处看,人们建议获取任意class的字节,必须简单地做
Class.forName(className).getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");
然后使用您选择的方法读取 InputStream
,但是这在 bootstrap class 加载器加载的 classes 上是不可能的(例如java.lang.Object
), 至于那些 classes Class#getClassLoader()
returns null
.
> Class.forName("java.lang.Object").getClassLoader()
null
这可能吗?我听说它可以通过检测来完成,但我希望有一种“更好”的方法来做到这一点(除了在 Java 安装中定位 rt.jar
并读取 class 数据从那里或其他地方)
我已经弄明白了。您只需要从 ClassLoader#getSystemClassLoader()
.
获取系统 class 加载程序
ClassLoader loader = Class.forName(className).getClassLoader();
if (loader == null) loader = ClassLoader.getSystemClassLoader();
final URL url = loader.getResourceAsStream(className.replace('.', '/') + ".class");
// read...
我想知道是否可以获取由 bootstrap class 加载程序加载的 class 的字节。我到处看,人们建议获取任意class的字节,必须简单地做
Class.forName(className).getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");
然后使用您选择的方法读取 InputStream
,但是这在 bootstrap class 加载器加载的 classes 上是不可能的(例如java.lang.Object
), 至于那些 classes Class#getClassLoader()
returns null
.
> Class.forName("java.lang.Object").getClassLoader()
null
这可能吗?我听说它可以通过检测来完成,但我希望有一种“更好”的方法来做到这一点(除了在 Java 安装中定位 rt.jar
并读取 class 数据从那里或其他地方)
我已经弄明白了。您只需要从 ClassLoader#getSystemClassLoader()
.
ClassLoader loader = Class.forName(className).getClassLoader();
if (loader == null) loader = ClassLoader.getSystemClassLoader();
final URL url = loader.getResourceAsStream(className.replace('.', '/') + ".class");
// read...