У меня есть два класса, перечисленных ниже
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? >>foo.CustomClassLoader@de6ced
Мои вопросы приведены ниже:
Почему эти java.lang.System
, java.nio.charset.Charset
и т. Д., Как указано выше, будут загружены CustomClassLoader
?В моих идеях я думаю, что когда я запускаю java -Djava.system.class.loader foo.Test
, JVM сначала ищет класс foo.Test
, загружает его, выполняет основной метод, а затем, когда он обнаруживает System.out.println()
, он продолжает загружать класс java.lang.System
и * 1021.* потому что эти классы используются им, верно?
Когда я запускаю класс, который использует некоторые классы, расположенные в пакете java.lang
, эти классы также будут загружены снова, в моем случаеделегированный CustomClassLoader >> ExtClassLoader >> BoostrapClassLoader для загрузки?
Когда загружены /lib/rt.jar
и /lib/ext/**.jar
, прежде чем мы запустим такой класс, как java foo.Test
, все эти классы уже загружены.?
Спасибо всем за помощь заранее!