java类加载机制(二)自定义类加载器

自定义类加载器

1 继承classLoader类

2 重写findClass方法

 

看一下自定义的类加载器:

/**
 * @program: springanalysis
 * @description:
 * @author: jiaxiaotong
 * @create: 2019-12-05 12:14
 */
public class MyClassLoader extends ClassLoader {

    public static void main(String[] args) throws Exception{
        MyClassLoader myClassLoader = new MyClassLoader();
        Class<?> aClass = myClassLoader.loadClass("com.xibei.HelloWord");
        System.out.println(o.getClass());
    }

    @Override
    public Class<?> findClass(String name) throws ClassNotFoundException {
        System.out.println("findClass invoke: "+name);
        InputStream is = null;
        byte[] data = null;
        ByteArrayOutputStream baos = null;
        String fileName  = name.replace(".", "\\");
        try {
            File file = new File("C:\\Users\\79960\\Desktop\\"+fileName+".class");
            is = new FileInputStream(file);
            baos = new ByteArrayOutputStream();
            int ch = 0;
            while (-1 !=(ch = is.read()))
            {
                baos.write(ch);
            }
            data = baos.toByteArray();

        }catch (Exception e)
        {
            e.printStackTrace();
        }finally {
            try {
                is.close();
                baos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return defineClass(name,data,0,data.length);
    }
}

在测试的时候,写了一个helloworld的类,并执行javac进行编译成.class文件。在桌面上新建了 com/xibei的文件夹,并将编译好的.class放入文件夹中。

在程序执行的时候,由于appClassloader以及父类加载器无法加载外部的类,所以会根据自定义的类加载器重写的findclass进行该类的加载。将此class文件通过二进制流的方式读取,并定义,加载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每年进步一点点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值