java的classloader繼承自ClassLoader類別
classloader都會有一個parent的classloader
如果在new的時後沒有指定parent ()以super(parentClassloader)
會自動得以new該classloader的類別的所屬的Classloader做為parent
例:
AppClassLoader -> load -> ParentClass -> new ChildClassLoader()
假如ChildClassLoader的建構子沒有super(someOtherClassloader);
則ChildClassLoader的parent就是AppClassLoader(load ParentClass的classloader)
classloader在loadclass之前會先使用parent來loadclass
都找不到才會自己load
loadclass步驟會先使用findclass(),有找到再使用defineclass()
/********java.lang.ClassLoader()方法**********/
protected synchronized Class loadClass
(String name, boolean resolve)
throws ClassNotFoundException{
// First check if the class is already loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke
// findClass to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
/********java.lang.ClassLoader()方法**********/
假如自訂的ClassLoader沒有繼承getResourceAsStream()
取得resource會取不到,得到null
沒有留言:
張貼留言