類加載器功用
- 以前看Tomcat類加載器,雲裏霧裏,後來再戰類加載仍是不理解到底幹什麼的
- 忽然就想到了,Tomcat下可能會出現多個同名的class文件,怎麼保證不衝突,而且各自代碼運行各自的class呢,嗯,類加載器
- 動態加載類
- 等等等,目前用不到的功能,加密....
- 舉例,加載同名class,但各自運行不衝突。
- 以下,兩個自定的classloader加載同名class運行在JVM中
public class V extends Date{
public String toString() {
//另外一個同名class是version2
return "version1";
}
}
public class ClTest {
public static void main(String[] args) throws Exception {
ClassLoader c1 = new ClassLoader(){
@Override
protected Class findClass(String name) throws ClassNotFoundException {
String path = "D:\\classloader\\V.class";
byte[] classBytes = new byte[0];
try {
classBytes = Files.readAllBytes(new File(path).toPath());
} catch (Exception e) {
}
Class c = this.defineClass(name, classBytes, 0, classBytes.length);
return c;
}
};
ClassLoader c2 = new ClassLoader(){
@Override
protected Class findClass(String name) throws ClassNotFoundException {
String path = "D:\\classloader\\version2\\V.class";
byte[] classBytes = null;
try {
classBytes = Files.readAllBytes(new File(path).toPath());
} catch (Exception e) {
}
Class c = this.defineClass(name, classBytes, 0, classBytes.length);
return c;
}
};
Class v = Class.forName("V", true, c1);
Date o = (Date) v.newInstance();
Class v2 = Class.forName("V", true, c2);
Date o2 = (Date) v2.newInstance();
System.out.println(new String(o.toString().getBytes(),"UTF-8"));
System.out.println(new String(o2.toString().getBytes(),"UTF-8"));
System.out.println(o.equals(o2));
}
}
自定義Classloader
- Classloader.loadClass 實現了雙親委派的機制,若是要自定加載機制可重寫
- Classloader.findClass 用來給開發者重寫自定加載class文件的方法,可自定
- Classloader.defineClass 接受class的字節數據,返回class,native方法安安生生的用吧
雙親委派工做原理
雙親委派模式優點
- 雖然沒用過,可是理解了,摘抄。採用雙親委派模式的是好處是Java類隨着它的類加載器一塊兒具有了一種帶有優先級的層次關係,經過這種層級關能夠避免類的重複加載,當父親已經加載了該類時,就沒有必要子ClassLoader再加載一次。其次是考慮到安全因素,java核心api中定義類型不會被隨意替換