这是我的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的父类加载器。
答案 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