jvm复习: 通过重写findClass方法来自定义类加载器

一、定义类,继承ClassLoader

package cn.edu.tju.test;

import java.io.*;

public class MyClassLoader extends ClassLoader{
    private final String fileExtension=".class";
    private String path="";
    private String classLoaderName;
    public MyClassLoader(){
        super();
    }

    public MyClassLoader(String path){
        super();
        this.path = path;
    }

    public MyClassLoader(String path, ClassLoader parent){
        super(parent);
        this.path=path;
    }

    @Override
    protected Class<?> findClass(String className) {
        byte[] data = this.loadClassData(className);
        System.out.println("find class called......");
        return this.defineClass(className, data, 0, data.length);
    }

    private byte[] loadClassData(String className) {
        InputStream inputStream = null;
        byte[] data = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        try {
            className = className.replace('.', '\\');
            inputStream = new FileInputStream(new File( path +className + fileExtension));
            byteArrayOutputStream = new ByteArrayOutputStream();
            int ch = 0;
            while (-1 != (ch = inputStream.read())) {
                byteArrayOutputStream.write(ch);
            }
            data = byteArrayOutputStream.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
                byteArrayOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return data;
    }
}

二、创建自定义类加载器的实例,并加载类:

package cn.edu.tju.test;

public class ClassLoaderTest4 {
    public static void main(String[] args) throws Exception {
        MyClassLoader myGoodClassLoader = new MyClassLoader("d:\\");
        Class<?> clazz = myGoodClassLoader.loadClass("cn.edu.tju.domain.E");
        System.out.println(clazz);
        Object object =clazz.newInstance();
        System.out.println(object);
        System.out.println(clazz.getClassLoader());

    }
}

其中E.class这个文件是位于D:\cn\edu\tju\domain这个目录的一个类文件。

loadClass时,首先会委托其父加载器AppClassLoader进行加载,
AppClassLoader委托ExtClassLoader进行加载,
ExtClassLoader委托Bootstrap ClassLoader进行加载,加载失败,返回ExtClassLoader进行加载,
ExtClassLoader加载失败,返回AppClassLoader进行加载,如果类路径下没有E.class这个文件,加载失败,返回MyClassLoader进行加载,
如果加载成功,则继续执行,否则抛出类加载失败异常

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值