Java 库存JDK类和;空";类加载器?

Java 库存JDK类和;空";类加载器?,java,classloader,Java,Classloader,我试图通过查看一些动态创建的组件的ClassLoaders来调试一个非常奇怪的类错误类加载器(code>ClassLoader)s是我从来没有玩过的东西——我很惊讶标准JDK类有null类加载器实例 有没有人能解释一下这个简单的main方法的输出,比如我试图打印其装入器的类,以及更一般的: 类加载器在JVM和 如何使用ClassLoaders调试缺少的类 公共类MyClass{ /** *@param args */ 公共静态void main(字符串[]args){ System.out.pr

我试图通过查看一些动态创建的组件的
ClassLoader
s来调试一个非常奇怪的类错误<代码>类加载器(code>ClassLoader)s是我从来没有玩过的东西——我很惊讶标准JDK类有null类加载器实例

有没有人能解释一下这个简单的main方法的输出,比如我试图打印其装入器的类,以及更一般的:

  • 类加载器在JVM和
  • 如何使用
    ClassLoader
    s调试缺少的类
  • 公共类MyClass{
    /**
    *@param args
    */
    公共静态void main(字符串[]args){
    System.out.println(relfect.MyClass.class.getClassLoader());
    System.out.println(String.class.getClassLoader());
    System.out.println(ArrayList.class.getClassLoader());
    System.out.println(JButton.class.getClassLoader());
    System.out.println(System.class.getClassLoader());
    布尔值b=新布尔值(真);
    System.out.println(b.getClass().getClassLoader());
    }
    }
    
    输出

    sun.misc.Launcher$AppClassLoader@1f7182c1
    null
    null
    null
    null
    null
    
    getClassLoader()
    的javadoc说

    返回类的类装入器。一些实现可能使用null来表示引导类加载器。如果该类是由引导类装入器装入的,则在此类实现中,该方法将返回null

    所以,这至少解释了为什么你会得到这个结果。但它并没有解释为什么实现者决定这样做

    编辑:
    在测试将我自己的类添加到bootclasspath之后,它们也显示为null类加载器。

    引导类的类加载器为null,它不是java类

    不要将类路径中找到的类与引导加载程序加载的类弄错。后者负责通常在rt.jar中找到的核心JDK类。它是本机类加载器,因此没有对的引用

    类路径上的类由系统类加载器加载,它的类可以通过属性指定


    此外,空类加载器被认为是一个安全问题,并且有基于调用方类具有空类加载器的检查。

    这就是它的工作原理。每当JVM尝试加载任何类时,它都会检查以下条件

    如果类是从引导类路径加载的,即;jdk\jre\lib\rt.jar,将调用引导类加载器

    如果类是从扩展类路径加载的,即;jdk\jre\lib\ext*.jar,将调用扩展类加载器

    如果类是从应用程序类路径加载的,即;正如环境变量中指定的,调用应用程序类加载器

    由于Bootstrap ClassLoader不是在java中实现的,它是用C++或C++实现的,所以没有引用,这就是它返回null的原因。但是扩展和应用程序类加载器是用java编写的,因此您将获得sun.misc.Launcher的引用$ExtClassLoader@someHexValue和sun.misc.Launcher$AppClassLoader@someHexValue


    因此,如果您执行类似于System.out.println(String.class.getClassLoader())的操作,您将得到null,因为这个类是由引导类加载器调用的,另一方面,如果对Ext或App类路径中的类执行相同的操作,您将得到$ExtClassLoader@someHexValue和sun.misc.Launcher$AppClassLoader@someHexValue分别回答。

    谢谢,我正在编辑问题,您回答了我提出的更一般的问题。但无论如何,你的回答是有帮助的。@jayunit100对不起;-)但你总是可以发布更多的问题。这是旧功能。我想这是因为“犯了错误”。一个可能的原因是,通过返回null,类不需要存储和/或跟踪类装入器;它只是将getClassLoader实现为
    {returnnull}
    hmmm。。。好的——那么我的类如何从源代码默认为sun“App”类加载器呢?@jayunit100一些类加载器必须加载你的类,如果你还没有实现它,必须有人来加载。此外,空类加载器似乎只用于引导类(通常是JVM附带的类)。将您自己的类放在引导程序中并查看它报告的内容是很有意思的。这个问题似乎与主题无关,因为StackOverflow并不能替代琐碎的JDK文档。