获取由 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...