java如何通过引导类加载器以编程方式加载另一个类?
我知道有一个“引导类加载器”从jre/lib(rt.jar等)加载所有类。为了从另一个非java包中加载一个额外的类,我是否可以使用这个“引导类加载器”
我说的是引导类路径,它与这个答案中描述的常规类路径非常不同:How should I load Jars dynamically at runtime?
你可以在下面搜索框中键入要查询的问题!
我知道有一个“引导类加载器”从jre/lib(rt.jar等)加载所有类。为了从另一个非java包中加载一个额外的类,我是否可以使用这个“引导类加载器”
我说的是引导类路径,它与这个答案中描述的常规类路径非常不同:How should I load Jars dynamically at runtime?
# 1 楼答案
通过引导类加载器加载类的一种比较迂回的方法是定义自己的类加载器,如下所示:
这个类装入器没有父类,因此它装入类的唯一位置是固有的引导类装入器
# 2 楼答案
引导类加载器表示为} :
null
,例如在调用Class.getClassLoader()
时。这可以直接输入到^{因此,您可以尝试使用
Class.forName(className,true,null)
通过引导加载程序显式加载一个类,或者使用Class.forName(className,true,context.getClassLoader())
解析与另一个类的上下文相关的类,而无需对引导加载程序进行特殊处理如果您想定义一个运行时类,就像是由引导加载程序加载一样,那么没有标准的解决方案。有一种方法^{} 允许在特定的类加载器中定义一个类,这是一种可能在未来消失的专有API
从Java 9开始,有^{} ,这是一种标准方法,在另一个类的上下文中定义一个类,但它需要非标准的方法,例如使用访问覆盖的反射来获得
Lookup
对象,该对象具有对引导加载的类的适当访问权,例如java.lang.Object
。现有的Q&;关于为其他目的创建这样的Lookup
对象,例如this one。不过,这种反射黑客并不能保证在未来的版本中有效对于Java代理,如果不介意这涉及到I/O,还可以选择将类文件转储到临时Jar文件中,并通过编程add it to the bootstrap class path
还有一个问题需要注意。当您希望其他引导加载的类找到您的类时,您必须在第一次尝试访问该类之前添加它,因为JVM的解析器将记住结果,即使它会因错误而失败