创建自定义类加载器
package com.example.jvm.classloader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; /** * Created by Think on 2019/6/9. */ public class MyTest16 extends ClassLoader{ private String classLoadName; private final String fileExtension = ".class"; public MyTest16(String classLoadName){ super(); //将系统类加载器当做该类加载器的父加载器 this.classLoadName = classLoadName; } public MyTest16(ClassLoader parent, String classLoadName){ super(parent); //显示指定该类加载器的父加载器器 this.classLoadName = classLoadName; } @Override public String toString() { return "[" + this.classLoadName + "]"; } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { byte[] data = this.loadClassData(classLoadName); return this.defineClass(classLoadName,data, 0, data.length); } private byte[] loadClassData(String name){ InputStream is = null; byte[] data = null; ByteArrayOutputStream baos = null; try{ this.classLoadName = this.classLoadName.replace(".","//"); is = new FileInputStream(new File(name + this.fileExtension)); baos = new ByteArrayOutputStream(); int ch = 0; while ( -1 != (ch = is.read())){ baos.write(ch); } data = baos.toByteArray(); }catch (Exception ex){ ex.printStackTrace(); }finally { try { is.close(); baos.close(); }catch (Exception ex){ ex.printStackTrace(); } } return data; } public static void main(String[] args) throws Exception{ MyTest16 loader1 = new MyTest16("loader1"); test(loader1); } public static void test(ClassLoader classLoader) throws Exception { Class<?> clazz = classLoader.loadClass("com.example.jvm.classloader.MyTest1"); Object object = clazz.newInstance(); System.out.println(object); } }
打印结果
com.example.jvm.classloader.MyTest1@1540e19d