我有兩個類如下如何以及當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?
非常感謝您的幫助!