對於java自定義的類加載器,須要繼承ClassLoader類,而且實現它的findClass方法,而後調用父類的defineClass方法,返回加載後的類 java
defineClass方法要求一個類的權限定名稱獲取定義此類的二進制字節流。這個是虛擬機的規範,可是這個規範並不具體,這樣就爲各個不一樣虛擬機版本實現提供了很大的空間,好比它並無規範這個二進制字節流是從哪裏來的, tomcat
本示例代碼很是簡單,僅僅是直接調用一個本地的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(); } }