java 自定義類加載器

    對於java自定義的類加載器,須要繼承ClassLoader類,而且實現它的findClass方法,而後調用父類的defineClass方法,返回加載後的類 java

    defineClass方法要求一個類的權限定名稱獲取定義此類的二進制字節流。這個是虛擬機的規範,可是這個規範並不具體,這樣就爲各個不一樣虛擬機版本實現提供了很大的空間,好比它並無規範這個二進制字節流是從哪裏來的, tomcat

  • 從ZIP包進行讀取,這就成爲了 的war,jar,EAR格式的基礎,
  • 能夠計算時動態生成,這就爲動態代理提供了可能,
  • 能夠從網絡中獲取,這就發展成了Applet,
  • 固然還能有其餘的文件生成,例如JSP技術

本示例代碼很是簡單,僅僅是直接調用一個本地的class文件進行加載,加載完成之後,調用這個文件的sayHi把語句輸出到控制檯 網絡

一、一個須要被加載的類 ide

package com.example.tomcat;

public class Foo {

	public void sayHi(){
		System.out.println("hello world");
	}
}
二、自定義的類加載器
package com.example.tomcat;

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

public class MyClassLoader extends ClassLoader {

	//類加載器的名稱
    private String name;
    //類存放的路徑
    private String classpath = "D:\\stsworkspace\\demo\\target\\classes\\com\\example\\tomcat\\";
   
    
    MyClassLoader(String name) {
        this.name = name;
    }
     
    MyClassLoader(ClassLoader parent, String name) {
        super(parent);
        this.name = name;
    }
    /**
     * 重寫findClass方法
     */
    @Override
    public Class<?> findClass(String name) {
        byte[] data = loadClassData(name);
        return this.defineClass(name, data, 0, data.length);
    }
    public byte[] loadClassData(String name) {
        try {
            name = name.replace(".", "//");
            FileInputStream is = new FileInputStream(new File(classpath + name + ".class"));
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int b = 0;
            while ((b = is.read()) != -1) {
                baos.write(b);
            }
            return baos.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public static void main(String args[]) throws Exception{
    	MyClassLoader my = new MyClassLoader("myLoader");
    	Class<?> loadClass = my.loadClass("com.example.tomcat.Foo");
    	Foo cast = (Foo)loadClass.newInstance();
    	cast.sayHi();
    	
    }
}
相關文章
相關標籤/搜索