类加载-自定义类加载器

3.2.4. 自定义类加载器ClassLoader

3.2.4.1. 自定义类加载器介绍

1)自定义类加载器的作用
a.安全。避免核心类库被随意篡改。此外,Bootstrap、Extension、Application类加载器只能加载指定路径下的类字节码,如果想要加载某些特定位置的类文件或者加载网络上的某个类文件时上述三种类加载器就不适用了,需要使用自定义的类加载器。
b.加密。java字节码很容易被反编译,通过定制ClassLoader使得字节码先加密防止别人下载后反编译,这里的ClassLoader相当于一个动态的解码器
c.归档。可能为了节省网络资源,对自己的代码做一些特殊的归档,然后用定制的ClassLoader来解档 。
d.自展开程序。把java应用程序编译成单个可执行类文件,这个文件包含压缩的和加密的类文件数据,同时有一个固定的ClassLoader,当程序运行时它在内存中完全自行解开,无需先安装
e.动态生成。可以生成应用其他还未生成类的类,实时创建整个类并可在任何时刻引入JVM
f.热部署。当需要实现热部署功能时(一个class文件通过不同的类加载器产生不同class对象从而实现热部署功能),不过需要实现自定义ClassLoader的逻辑。

2)实现自定义类加载器的方式
在自定义类加载器时,如果没有太过于复杂的需求,可以直接继承URLClassLoader类,这样就可以避免自己去编写findClass()方法及其获取字节码流的方式,使得自定义类加载器编码更简洁。如果在定义类加载器时选择继承ClassLoader类而非URLClassLoader,必须手动编写findclass()方法的加载逻辑以及该方法中获取字节码流的逻辑。
3)自定义类加载器的流程
实现自定义的类加载器需继承ClassLoader,然后重写里面的findClass()方法,再调用defineClass()方法将字节码转为类,即可完成类的加载。
重写findClass()方法时,根据要加载类的对象不同而采用不同的实现。这里是加载本地程序java文件Hello中的Hello类,采用读取文件流的形式读取Hello.java文件,形成二进制流,然后将二进制流转为字节数组,再通过defineClass方法转为class对象。

3.2.4.2. 自定义类加载的三种实现

1)自定义文件类加载器
【方法1】 加载ClassLoaderIntroduce路径下sayHello文件中得的Hello类。这里采用继承ClassLoader而非URLClassLoader,因此需要手动编写findclass()方法的加载逻辑以及该方法中获取字节码流的逻辑。

public class MyClassLoader {
   

    private static class customizedClassLoader extends ClassLoader{
   
        @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
   
            File file = new File("D:/CodeEdit/Java/BasicKnowledgeLearning/JVM/src/ClassLoaderIntroduce/", name.replace(".","/").concat(".class"));
            try{
   
                FileInputStream fis = new FileInputStream(file);
                ByteArrayOutputStream bos = new ByteArrayOutputStream();

                int length = 0 ;
                while((length=fis.read()) != 0){
     // 以二进制流的形式读取文件
                    bos.write(length);
                }

                byte[] data = bos.toByteArray();   // 将二进制流转为byte数组

                bos.close();
                fis.close();

                return defineClass(name,data, 0, data.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值