java類加載機制(二)自定義類加載器

自定義類加載器

1 繼承classLoader類

2 重寫findClass方法

 

看一下自定義的類加載器:

/**
 * @program: springanalysis
 * @description:
 * @author: jiaxiaotong
 * @create: 2019-12-05 12:14
 */
public class MyClassLoader extends ClassLoader {

    public static void main(String[] args) throws Exception{
        MyClassLoader myClassLoader = new MyClassLoader();
        Class<?> aClass = myClassLoader.loadClass("com.xibei.HelloWord");
        System.out.println(o.getClass());
    }

    @Override
    public Class<?> findClass(String name) throws ClassNotFoundException {
        System.out.println("findClass invoke: "+name);
        InputStream is = null;
        byte[] data = null;
        ByteArrayOutputStream baos = null;
        String fileName  = name.replace(".", "\\");
        try {
            File file = new File("C:\\Users\\79960\\Desktop\\"+fileName+".class");
            is = new FileInputStream(file);
            baos = new ByteArrayOutputStream();
            int ch = 0;
            while (-1 !=(ch = is.read()))
            {
                baos.write(ch);
            }
            data = baos.toByteArray();

        }catch (Exception e)
        {
            e.printStackTrace();
        }finally {
            try {
                is.close();
                baos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return defineClass(name,data,0,data.length);
    }
}

在測試的時候,寫了一個helloworld的類,並執行javac進行編譯成.class文件。在桌面上新建了 com/xibei的文件夾,並將編譯好的.class放入文件夾中。

在程序執行的時候,由於appClassloader以及父類加載器無法加載外部的類,所以會根據自定義的類加載器重寫的findclass進行該類的加載。將此class文件通過二進制流的方式讀取,並定義,加載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章