自定义classloader的固定套路

固定套路如下:

1. extends classloader 或者其他classloader实现

2. 重写如下父类方法:

Class findClass(String name)

3. 在步骤2中,读取.class的二进制文件数据,然后调用父类中的defineClass方法还原出Class对象。

 

实战实例:

public class SepClassLoader extends ClassLoader {


    /**
     * 需要该类加载器直接加载的类文件的基目录
     */
    private String baseDir;

    /**
     * 需要由该类加载器直接加载的类名
     */
    private HashSet classSet;

    /**
     * 带参构造
     * @param baseDir
     * @param classes
     * @throws IOException
     */
    public SepClassLoader(String baseDir, String[] classes) throws IOException {
        //TODO 存疑,实际上我这里改成super()也能很好的运行
        super(null);
        this.baseDir = baseDir;
        this.classSet = new HashSet();
        for (int i = 0; i < classes.length; i++) {
            findClass(classes[i]);
            classSet.add(classes[i]);
        }
    }

    /**
     * 重写findclass方法
     * <p>
     * 在ClassLoader中,loadClass方法先从缓存中找,缓存中没有,会代理给父类查找,如果父类中也找不到,就会调用此用户实现的findClass方法
     *
     * @param name
     * @return
     */
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章