自定義擴展類加載器

分三個步驟:第一步寫測試代碼,第二步寫讀取class文件邏輯,第三部通過自定義類加載器獲取測試代碼輸出結果

(1)編寫測試代碼

public class Robot {
	static {
		System.out.println("Robot class : hello world");
	}
}

很簡單的一個例子,在第三步中只要newInstance()就可以輸出這句話.前提是要javac一下,生成class文件。

(2)編寫讀取class文件邏輯(自定義類加載器)

package com.interview.thread;

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 path;
	private String classLoaderName;
	public MyClassLoader(String path, String classLoaderName) {
		this.path = path;
		this.classLoaderName = classLoaderName;
	}
	
	//用於尋找類文件
	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		byte[] b = loadClassData(name);
		return defineClass(name,b, 0, b.length);
	}
	//用於加載類文件
	private byte[] loadClassData(String name) {
		name = path + name + ".class";
		InputStream in = null;
		ByteArrayOutputStream out = null;
		try {
			in = new FileInputStream(new File(name));
			out = new ByteArrayOutputStream();
			int len = 0;
			while((len = in.read()) != -1) {
				out.write(len);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				out.close();in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
		return out.toByteArray();
	}
	

}

(3)通過自定義類加載器獲取測試代碼輸出結果

package com.interview.thread;

public class MyClassLoaderTest {
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		MyClassLoader classLoader = new MyClassLoader("C:\\Users\\80500\\Desktop\\", "myCustmerClassLoader");
		Class loadClass = classLoader.loadClass("Robot");
		loadClass.newInstance();
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章