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

时间:2016-05-13 06:30:04

标签: java classloader

这是我的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

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

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

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

sun.misc.Launcher$AppClassLoader@70a0afab

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

1 个答案:

答案 0 :(得分:0)

扩展类加载器仅加载Jar文件中的类。

假设以下结构

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

创建一个包含类

的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

运行您的课程Test

java com.study.test.Test

输出类似(从你的任务中复制的目录)

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