反射显式加载java。类加载器
在第一种情况下,对于使用以下代码显式加载test.ClassLoaderTest
public ClassLoaderTest{
public static void main(String[] args){
.....
Class.forName("test.ClassLoaderTest", true,
ClassLoaderTest.class.getClassLoader().getParent());
....
}
调用Launcher$ExtClassLoader
实例的findClass()
方法来加载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");
....
}
Launcher$AppClassLoader
实例的loadClass()
方法最终用于加载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
通过调用
ClassLoader cl = getClassLoader0();
再次调用类装入器实例
java.lang.ClassLoader
主要用于自定义类装入器的子类化吗?加载类路径中不可用但来自网络源等的类
# 1 楼答案
从Javadoc
有不同的类加载器实现,它们使用不同的策略来定位和读取组成类的字节流