我有两个类如下如何以及当Bootstrap jar找到../ lib/rt.jar和../lib/ext.**jar时被加载?
package foo;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class CustomClassLoader extends ClassLoader {
public CustomClassLoader(ClassLoader parent){
super(parent);
}
public Class<?> loadClass(String name) throws ClassNotFoundException {
System.out.println(" >>> loading " + name);
if (name.startsWith("foo")) {
return getClass(name);
}
return super.loadClass(name);
}
public Class getClass(String name){
try {
byte[] data= getClassByteData(name);
return this.defineClass(name, data, 0, data.length);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public byte[] getClassByteData(String name) throws IOException {
String file = name.replace(".", File.separator)+".class";
InputStream in = this.getClass().getResourceAsStream("/"+file);
int length = in.available();
byte[] datas = new byte[length];
in.read(datas, 0, length);
return datas;
}
}
package foo;
public class Test {
public static void main(String[] args) {
System.out.println(" Who is my loader? >>" + Test.class.getClassLoader());
}
}
运行:java -Djava.system.class.loader=foo.CustomClassLoader foo.Test
输出:
>>> loading java.lang.System
>>> loading java.nio.charset.Charset
>>> loading java.lang.String
>>> loading foo.Test
>>> loading java.lang.Object
>>> loading java.lang.StringBuilder
>>> loading java.lang.Class
>>> loading java.io.PrintStream
Who is my loader? >>[email protected]
我的问题是如下:
为什么那些
java.lang.System
,java.nio.charset.Charset
等如前所述ve会被加载CustomClassLoader
?在我的想法中,当我运行java -Djava.system.class.loader foo.Test
时,JVM首先搜索类foo.Test
,加载它,执行主要方法,然后当它检测到System.out.println()
时,它将继续加载类java.lang.System
和java.io.PrintWriter
,因为这些类是由它使用的, ?当我运行它使用位于
java.lang
包中的一些类的类,这些类也将被再次加载,在我的情况下放CustomClassLoader >> >>的ExtClassLoader BoostrapClassLoader加载?当
/lib/rt.jar
和/lib/ext/**.jar
被加载时,在我们运行一个像java foo.Test
这样的类之前,所有这些类都已经加载了bean?
非常感谢您的帮助!