在第一种情况下,使用以下代码显式加载test.ClassLoaderTest
public ClassLoaderTest{
public static void main(String[] args){
.....
Class.forName("test.ClassLoaderTest", true,
ClassLoaderTest.class.getClassLoader().getParent());
....
}
由于可见性原则,findClass()
实例的Launcher$ExtClassLoader
方法被调用以加载test.ClassLoaderTest
且误差低于此值
java.lang.ClassNotFoundException: test.ClassLoaderTest
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:229)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at test.ClassLoaderTest.main(ClassLoaderTest.java:29)
在第二种情况下,使用
显式加载test.ClassLoaderTest1
public ClassLoaderTest{
public static void main(String[] args){
.....
Class.forName("test.ClassLoaderTest1");
....
}
loadClass()
实例的 Launcher$AppClassLoader
方法最终用于加载test.ClassLoaderTest1
类,
其中test.ClassLoaderTest1
是错误的类文件导致错误,
java.lang.ClassNotFoundException: test.ClassLoaderTest1
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at test.ClassLoaderTest1.main(ClassLoaderTest.java:16)
在这两种情况下,班级加载工作都由java.net.URLClassLoader.findClass()
Class.forName()
在内部调用getClassLoader()
来了解已加载类的类加载器。
在第二种情况下,当Class
通过调用获取类加载器实例(类型为Launcher $ AppClassLoader)时
ClassLoader cl = getClassLoader0();
再次调用类加载器实例。
java.lang.ClassLoader
主要用于自定义类加载器的子类化吗?加载类在CLASSPATH中不可用,但来自网络源等...
答案 0 :(得分:1)
来自Javadoc,
public **abstract** class ClassLoader
extends Object
有不同的ClassLoader实现使用不同的策略来定位和读取组成类的字节流。