Java 如何以编程方式通过引导类加载器加载另一个类?

Java 如何以编程方式通过引导类加载器加载另一个类?,java,classloader,bootclasspath,Java,Classloader,Bootclasspath,我知道有一个“引导类加载器”从jre/lib(rt.jar等)加载所有类。为了从另一个非java包中加载一个额外的类,我是否有可能得到这个“引导类加载器” 我说的是引导类路径,它与这个答案中描述的常规类路径非常不同:引导类加载器表示为null,例如,在调用class.getClassLoader()时。这可以直接反馈给: 如果参数loader为空,则通过引导类加载器加载该类 因此,您可以尝试使用class.forName(className,true,null)通过引导加载程序显式加载类,或者使

我知道有一个“引导类加载器”从jre/lib(rt.jar等)加载所有类。为了从另一个非java包中加载一个额外的类,我是否有可能得到这个“引导类加载器”


我说的是引导类路径,它与这个答案中描述的常规类路径非常不同:

引导类加载器表示为
null
,例如,在调用
class.getClassLoader()
时。这可以直接反馈给:

如果参数
loader
为空,则通过引导类加载器加载该类

因此,您可以尝试使用
class.forName(className,true,null)
通过引导加载程序显式加载类,或者使用
class.forName(className,true,context.getClassLoader())解析与另一个类的上下文相关的类,而无需对引导加载程序进行特殊处理


如果您想定义一个运行时类,就像由引导加载程序加载一样,那么没有标准的解决方案。有一种方法允许在特定的类装入器中定义一个类,该类装入器是一种专有API,将来可能会消失

从Java 9开始,有一个标准方法在另一个类的上下文中定义一个类,但它需要非标准的方法,例如使用访问覆盖的反射来获得一个
Lookup
对象,该对象具有对引导加载类的适当访问权,例如
Java.lang.object
。已有关于为其他目的创建这样一个
查找
对象的问答,例如。不过,这种反射黑客不一定能在未来的版本中工作

对于Java代理,如果不介意这涉及到I/O,还可以选择将类文件转储到临时Jar文件中并通过编程实现


还有一个问题需要注意。当您希望其他引导加载的类找到您的类时,您必须在第一次尝试访问该类之前添加它,因为JVM的解析器将记住结果,即使失败并出现错误。

关于引导加载程序的可能重复:。我建议使用定制的
类加载器
。引导类加载器是非常不同的。不是重复的。你看到我的其他评论了吗。访问引导类加载器是不可能的。短语“加载一个类…到引导类路径”没有多大意义。您可以将jar文件添加到引导类路径,但不能添加单个类。如果您想强制创建一个运行时类,就像通过引导类加载器加载一样,那么没有标准的API,只有破解。@LatencyFighter关于系统类加载器的另一个问题很容易回答,因为存在一个现有的
类加载器
实例,而不是由
null
表示的引导类装入器。诚然,我有点惊讶,Java代理没有这样的选项来简单地定义一个类,但我扩展了我的答案,列出了我目前知道的所有选项。@FrancescoMenzani这是你不应该做的事情。您不应该将普通的应用程序类添加到引导加载程序中。除此之外,使用
class.forName(…)
加载反射类,然后使用像
new MyClass()
这样的非反射性用法是没有意义的。后者将已经加载该类。@FrancescoMenzani
new MyClass()
将询问应用程序类加载器,而应用程序类加载器将首先询问父加载器,因此如果该类位于引导路径上,它将由引导加载器加载。首先以反射方式加载它不会影响该逻辑。操纵引导类加载路径的选项…@hagrawal如果您的类仅通过普通类路径(或模块路径)提供,则引导加载程序无法看到该类。因此,是的,在这些正常情况下,不能使用引导加载程序加载类。通常情况下,没有必要这样做。