Java類加載器學習筆記
阿新 • • 發佈:2018-04-17
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; } @Overrideprotected 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類加載器學習筆記