1. 程式人生 > >Java類加載器學習筆記

Java類加載器學習筆記

xtend 讀取 instance DC over null urn loader not

今後一段時間會全面讀一下《深入理解Java虛擬機》

在這裏先記一下在網上看到的幾篇介紹 類加載器 的文章,等讀到虛擬機類加載機制再詳細介紹。

超詳細Java中的ClassLoader詳解

深入理解Java類加載器

貼一個自己寫的類加載器。

Hello類。 把編譯後的class文件放到別的路徑下。

package ww;

public class Hello {

    public void say() {
        System.out.println("hello world");
    }

}

WwClassLoader類。 繼承ClassLoader類 重寫 findClass()方法

package ww;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class WwClassLoader extends ClassLoader {

    private String path; //路徑
    public WwClassLoader(String path) {
        this.path = path;
    }

    @Override
    
protected Class<?> findClass(String name) throws ClassNotFoundException { String fileName = parseFileName(name); File file = new File(path,fileName); try { //讀取class文件 FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream baos
= new ByteArrayOutputStream(); int lenth = 0; while((lenth = fis.read()) != -1) { baos.write(lenth); } byte[] buffer = baos.toByteArray(); baos.close(); fis.close(); //實例化class對象 return defineClass(name,buffer,0,buffer.length); } catch (Exception e) { e.printStackTrace(); } return super.findClass(name); } //解析文件路徑 private String parseFileName(String name) { int index = name.lastIndexOf(.); if(index == -1) { return name+".class"; } else { return name.substring(index+1)+".class"; } } }

WwTest類。 調用測試

package ww;

import java.lang.reflect.Method;

public class WwTest {
    public static void main(String[] args) {
        //我一直在找為什麽自己定義的類的parent節點一定是AppClassLoader類的源碼。要是知道的大佬可以告訴我一聲
        /*private static native void registerNatives();
        static {
            registerNatives();
        }*/
        WwClassLoader ww = new WwClassLoader("E://lib");
        try {
            Class hel = ww.findClass("ww.Hello");
            //反射執行方法
            if (hel != null) {
                Object obj = hel.newInstance();
                Method method = hel.getDeclaredMethod("say", null);
                method.invoke(obj, null);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Java類加載器學習筆記