为什么我不能通过 ExtClassLoader 加载我的 class?

Why can't I load my class by ExtClassLoader?

这是我的 Java 项目的结构:

package: com.study.test
              ---- HelloWorld.java
              ---- Test.java

HelloWorld.java的内容:

package com.study.test;

public class HelloWorld {}

Test.java的内容:

package com.study.test;

public class Test {

    public static void main(String[] args) {
        System.out.println(System.getProperty("java.ext.dirs"));
        System.out.println(HelloWorld.class.getClassLoader());
    }

}

java.ext.dirs”的值为:

D:\glassfish4\jdk7\jre\lib\ext;C:\windows\Sun\Java\lib\ext

我把 class 文件 HelloWorld.class 放在目录中:

D:\glassfish4\jdk7\jre\lib\ext\com\study\test

但是“System.out.println(HelloWorld.class.getClassLoader());”的输出是:

sun.misc.Launcher$AppClassLoader@70a0afab

为什么 class HelloWorld 没有被 ExtClassLoader 加载? ExtClassLoader 是 AppClassLoader 的父 class 加载器。

扩展 classloader 仅从 Jar 文件中加载 classes。

假设以下结构

src/Test.java
src/HelloWorld.java

修改Test.java为(编辑这不是真的需要,只是为了说明编译时没有解析)

package com.study.test;
public class Test {
    public static void main(String[] args) throws Exception {
        System.out.println(System.getProperty("java.ext.dirs"));
        System.out.println(Class.forName("com.study.test.HelloWorld")
            .getClassLoader());
    }
}

编译它们

mkdir bin/
javac -d bin/ src/Test.java src/HelloWorld.java

创建一个包含 classes

的 Jar 文件
jar cf test-hello.jar -C bin/ .

验证 Jar 文件的内容

jar tf test-hello.jar

输出

META-INF/                       
META-INF/MANIFEST.MF            
com/                            
com/study/                      
com/study/test/                 
com/study/test/HelloWorld.class 
com/study/test/Test.class       

移动扩展目录中的test-hello.jar

mv test-hello.jar D:\glassfish4\jdk7\jre\lib\ext

运行 你的 class Test

java com.study.test.Test

输出相似(从你的问题中复制的目录)

D:\glassfish4\jdk7\jre\lib\ext;C:\windows\Sun\Java\lib\ext
sun.misc.Launcher$ExtClassLoader@70dea4e