显式加载 - java.lang.ClassLoader

时间:2017-09-19 20:18:46

标签: java reflection classloader

在第一种情况下,使用以下代码显式加载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中不可用,但来自网络源等...

1 个答案:

答案 0 :(得分:1)

来自Javadoc,

public **abstract** class ClassLoader
extends Object

有不同的ClassLoader实现使用不同的策略来定位和读取组成类的字节流。