有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 1 楼答案

    通过引导类加载器加载类的一种比较迂回的方法是定义自己的类加载器,如下所示:

        ClassLoader bootClassLoader = new ClassLoader(null){};
    

    这个类装入器没有父类,因此它装入类的唯一位置是固有的引导类装入器

  2. # 2 楼答案

    引导类加载器表示为null,例如在调用Class.getClassLoader()时。这可以直接输入到^{}

    If the parameter loader is null, the class is loaded through the bootstrap class loader.

    因此,您可以尝试使用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的解析器将记住结果,即使它会因错误而失败