1. 程式人生 > 實用技巧 >類載入器(1) -- 自定義ClassLoader類載入器

類載入器(1) -- 自定義ClassLoader類載入器

  java類載入器分四大類:根載入器、擴充套件類載入器、系統類載入器以及自定義載入器。

  自定義載入器,需要extends ClassLoader

 1 public class CustomClassLoader extends ClassLoader{
 2 
 3     @Override
 4     protected Class<?> findClass(String name) throws ClassNotFoundException {
 5         byte[] data = loadClassData(name);
 6         return
super.defineClass(name,data,0,data.length); 7 } 8 9 private byte[] loadClassData(String className) { 10 className = className.replace(".", File.separator); 11 InputStream inputStream = null; 12 byte[] data = null; 13 try { 14 inputStream = new FileInputStream(new
File(className+".class")); 15 data = IOUtils.toByteArray(inputStream); 16 } catch (Exception e){ 17 e.printStackTrace(); 18 } finally { 19 try { 20 inputStream.close(); 21 }catch (Exception e){ 22 e.printStackTrace();
23 } 24 } 25 return data; 26 } 27 28 public static void main(String[] args) throws Exception{ 29 CustomClassLoader classLoader = new CustomClassLoader(); 30 Class<?> clazz = classLoader.loadClass("com.jvm.classloader.TestDemo"); 31 Object object = clazz.newInstance(); 32 System.out.println(object); 33
34 } 35 }

findClass(String):通過二進位制名稱來查詢class。這個方法應該遵循類載入器的委託模型的類載入器來實現覆蓋(重寫該方法),並且將由loadClass方法在檢查父類載入器以獲取所請求的類之後呼叫。此方法由系統內部呼叫,而非程式碼主動呼叫。

loadClass(String): 載入指定的二進位制檔名的class,執行的順序:

  1、呼叫findLoadedClass(String),查詢是否已經載入 過,如果是則直接返回。

  2、呼叫父類載入器的loadClass(String) ,如果父類是null,則使用VM內建載入器

  3、呼叫findClass(String)查詢class