天天看點

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檔案通過二進制流的方式讀取,并定義,加載。