1. 程式人生 > >自定義類載入器的實現

自定義類載入器的實現

               

Java的類載入器自從JDK1.2開始便引入了一條機制,叫做父類委託機制。也就是說,一個類需要被載入的時候,

JVM先會呼叫他的父類載入器進行載入。如果父類載入器載入不了,再使用其子類進行載入。當然,這類所說的父類加

載器,不一定他們之間是繼承的關係,有可能僅僅是包裝的關係。不能片面理解。

Java之所以出現這條機制,因為是處於安全性考慮。害怕使用者自己定義class檔案然後自己寫一個類載入器來載入

原本應該是JVM自己載入的類。這樣會是JVM虛擬機器混亂或者說會影響到使用者的安全。

下面我們來自己實現一個類載入器,其中主要就是繼承ClassLoader類

package com.bird.classLoad;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public
class MyClassLoader extends ClassLoader private String name; // 類載入器的名字 private String path = "d://"; // 載入類的路徑 private final String fileType = ".class"; // .class副檔名 public MyClassLoader(String name) {  super();// 讓系統載入器成為該類的載入器的父類載入器  this.name = name; } public
MyClassLoader(ClassLoader parent, String name)
{  super(parent); // 顯示指定該類載入器的父載入器  this.name = name; } @Override public String toString() {  return this.name; } public String getPath() {  return path; } public void setPath(String path) {  this.path = path; }  /**  * 讀取class檔案作為二進位制流放入到byte陣列中去  * @param name  * @return  */ private byte[] loadClassData(String name) {  InputStream in = null;  byte[] data = null;  ByteArrayOutputStream baos = null;  try {   name = name.replace(".", "\\");   in = new BufferedInputStream(new FileInputStream(new File(path     + name + fileType)));   baos = new ByteArrayOutputStream();   int ch = 0;   while (-1 != (ch = in.read())) {    baos.write(ch);   }   data = baos.toByteArray();  } catch (Exception e) {   e.printStackTrace();  } finally {   try {    in.close();   } catch (IOException e) {    e.printStackTrace();   } finally {    try {     baos.close();    } catch (IOException e) {     e.printStackTrace();    }   }  }  return data; }  /**  * JVM呼叫的載入器的方法  */ @Override protected Class<?> findClass(String name) throws ClassNotFoundException {  byte[] data = this.loadClassData(name);  return this.defineClass(name, data, 0, data.length); }  public static void main(String[] args) throws Exception {  MyClassLoader loader1 = new MyClassLoader("loader1");  loader1.setPath("d://");  test(loader1); }  public static void test(ClassLoader loader) throws Exception{  Class<?> clazz = loader.loadClass("com.bird.classLoad.Simple");  Object object = clazz.newInstance(); }}

protected Class<?> findClass(String name) 這個方法是JVM自己呼叫的,如果覆蓋CLassLoader類,必須覆蓋這個方

法才能實現類的載入。然後裡面的private byte[] loadClassData(String name) 方法是載入class檔案變成二進位制檔案,

以便載入器完成class的引用。

           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow