(ClassLoader类加载器)自定义ClassLoader处理类

自定义ClassLoader处理类

类加载器的顺序是在所有的系统类加载器的最后,系统类中的类加载器都是根据CLASSPATH路径进行加载的,而如果有自定以的加载器,就可以由开发者任意指派类的加载位置。

  1. 编写一个类,放在F盘中。
    package test;
    
    public class test {
    
        public  void sent() {
            System.out.println("hellow word");
        }
    
    }
    
  2. 将此类不打包直接拷贝到F盘进行编译,此时这个类文件无法通过CLASSPATH正常加载。

  3. 定义一个类加载器并且继承自ClassLoader,在ClassLoader类里面为用户提供有一个自己转换为类结构的方法

    //将字节转换为class结构的方法
    protected final Class<?> defineClass​(String name, byte[] b, int off, int len) throws ClassFormatError
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    
    public class ClassLoaderDemo  extends ClassLoader{
    
        private static final  String TEST_CLASS_PATH = "F:"+ File.separator+"test.class";
    
        /**
         * 进行指定类的加载
         * @param className 类的完整名称“包.名称”
         * @return  返回一个指定类的Class对象
         * @throws Exception 如果类文件不存在则无法加载
         */
        public Class<?> loadData(String className) throws Exception{
    
            byte[] data = this.loadClassData(); //读取二进制数据文件
            if (data != null){  //不为null
                return  super.defineClass(className,data,0, data.length);
            }
            return  null;
    
        }
    
        private byte[] loadClassData() throws Exception{    //通过文件进行类的加载
    
            InputStream input = null;
            ByteArrayOutputStream byteArrayOutputStream = null; //将数据加载到内存之中
            byte[] data = null;
            try{
                byteArrayOutputStream = new ByteArrayOutputStream();    //实例化内存流对象
                input = new FileInputStream(new File(TEST_CLASS_PATH)); //文件流加载
                input.transferTo(byteArrayOutputStream);       //读取数据
                data = byteArrayOutputStream.toByteArray();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                if(input != null){
                    input.close();
                }
                if(byteArrayOutputStream != null){
                    byteArrayOutputStream.close();
                }
            }
            return data;
    
        }
    
    
    }
    

 如果以后结合到网络程序开发的话,就可以通过一个远程的服务器来确定类的功能。

 如果现在定义了一个类,这个类的名字是:java.lang.String,并且利用了自定义的类加载进行加载处理,这个类将不会被加载,java之中针对类加载器提供有双亲加载机制。如果现在要加载的程序类是系统提供的类则会由系统类进行加载,如果开发者定义的类与系统类名相同则不会被加载。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值