自定義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
     */
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章