java jvm-自定义类加载器

除了可以用系统默认的类加载器,我们还可以用实现自己的类加载器,类加载器实现步骤如下:

1.定义一个类继承ClassLoader
2.重写findClass方法,用来查找具体的类字节码
3.实例化自定义的类加载器,调用loadClass即可加载类

下面我们来自定义一个类加载器,加载我们自己路径的类字节码

package com.jvm.demo;

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;

/**
 * 自定义类加载器
 * @author liuxg
 * @date 2016年5月23日 下午5:52:29
 */
public class CustomClassLoader extends ClassLoader{


    private String rootPath ;


    /**
     * 类的路径
     * @param rootPath
     */
    public CustomClassLoader(String rootPath) {
        this.rootPath = rootPath ;
    }



    /**
     * 根据name来寻找该类
     * 
     */
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {

        Class<?> c = findLoadedClass(name);
        if (c  == null) { //内存堆中还没加载该类
            c = findMyClass(name);  //自己实现加载类
        }
        return c ;
    }


    /**
     * 加载该类
     * @param name
     * @return
     */
    private Class<?> findMyClass(String name) {

         String path = rootPath + "/" + name.replace(".", "/") + ".class" ;
         try {
             File file = new File(path); //获取文件
             if (file.exists()) {
                 byte[] bytes = FileUtils.readFileToByteArray(file);//利用org.apache.commons.io包来读取字节
                 return this.defineClass(null, bytes,0,bytes.length); //调用父类方法,生成具体类
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

}

使用我们自己的类加载器

public class Demo02 {

    public static void main(String[] args) {

        CustomClassLoader loader = new CustomClassLoader("D://myclass");        
        try {
            Class<?> clazz = loader.loadClass("com.myclass.Demo03");
            System.out.println(clazz);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

}

有了类加载器,你可以实现从任意地方加载资源,例如硬盘,http,ftp,类路径等等

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值