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方法的输出,比如我试图打印其装入器的类,以及更一般的:
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文档。