有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

反射显式加载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) 个答案

  1. # 1 楼答案

    从Javadoc

    public **abstract** class ClassLoader
    extends Object
    

    有不同的类加载器实现,它们使用不同的策略来定位和读取组成类的字节流