自定义类加载器
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文件通过二进制流的方式读取,并定义,加载。