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