Classloader之豁然開朗

類加載器功用

  • 以前看Tomcat類加載器,雲裏霧裏,後來再戰類加載仍是不理解到底幹什麼的
  • 忽然就想到了,Tomcat下可能會出現多個同名的class文件,怎麼保證不衝突,而且各自代碼運行各自的class呢,嗯,類加載器
  1. 動態加載類
  2. 等等等,目前用不到的功能,加密....
  • 舉例,加載同名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

  1. Classloader.loadClass 實現了雙親委派的機制,若是要自定加載機制可重寫
  2. Classloader.findClass 用來給開發者重寫自定加載class文件的方法,可自定
  3. Classloader.defineClass 接受class的字節數據,返回class,native方法安安生生的用吧

雙親委派工做原理

雙親委派模式優點

  • 雖然沒用過,可是理解了,摘抄。採用雙親委派模式的是好處是Java類隨着它的類加載器一塊兒具有了一種帶有優先級的層次關係,經過這種層級關能夠避免類的重複加載,當父親已經加載了該類時,就沒有必要子ClassLoader再加載一次。其次是考慮到安全因素,java核心api中定義類型不會被隨意替換
相關文章
相關標籤/搜索