对于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(); } }