自定义类加载器

来源:互联网 发布:英文软件 编辑:程序博客网 时间:2024/06/10 06:20

为什么要自定义?
我们的加载器默认从classpath下面加载类,如果有些类是远程的或者是其他文件目录下的,默认加载器是无法加载以上的类的,需要我们自己指定加载类路径,下面是代码,整个思路是把class文件一点一点读到byte数组里,然后使用二进制流操作对象类ByteArrayOutputStream从内存中读取byte数组中的值一点一点写到ByteArrayOutputStream对象里保存起来,返回该对象,使用父类里的defineClass方法将二进制数据解析成class对象,打印该class对象的一个具体实例【一切皆对象】
在本地F盘下面定义一个java类,手动编译成class字节文件

package test;public class Member{   public String toString(){     return "成功";   }}
class MyClassLoader extends ClassLoader{    public Class<?> loadMyClass(String className) throws Exception{        byte[] data = loadData();        return super.defineClass(className,data, 0, data.length);    }    private byte[] loadData() throws Exception{        InputStream is = new FileInputStream("F:"+File.separator+"Member.class");        ByteArrayOutputStream bos = new ByteArrayOutputStream();        byte[] data = new byte[100];        int tmp = 0;        while((tmp = is.read(data)) > 0){            bos.write(data, 0, tmp);        }        is.close();        bos.close();        return bos.toByteArray();    }}public class TestDemo {    public static void main(String[] args) throws ClassNotFoundException, Exception {        Class<?> clazz = new MyClassLoader().loadMyClass("test.Member");        System.out.println(clazz.newInstance());    }}运行结果:成功