此前我们分析了类的加载机制
反射及类加载机制
这次我们实现一下自己的类加载器。
class MyClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// TODO Auto-generated method stub
String Dir = "E:\\javaworkspace\\NiuKeWang\\bin";// 用户自定义路径进行拼接
//File.separatorChar 返回本地文件系统的名称分隔符。
String classPath = Dir + File.separatorChar + name.replace('.', File.separatorChar) + ".class";
//读取文件
File file = new File(classPath);
byte[] buff = null;
InputStream in;
try {
in = new FileInputStream(file);
buff = new byte[in.available()];
in.read(buff);
in.close();
//将其读入到buff中
//然后调用defineClass生成Class对象
Class<?> c = defineClass(name, buff, 0, buff.length);
return c;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//如果失败抛出ClassNotFoundException异常
return super.findClass(classPath);
}
}
测试
MyClassLoader myClassLoader = new MyClassLoader();
Class<?> loadClass = myClassLoader.loadClass("JianZhiOffer.ErWeiShuZuZhongDeChaZhao.My");
System.out.println(loadClass.getName());
结果E:\javaworkspace\NiuKeWang\bin\JianZhiOffer\ErWeiShuZuZhongDeChaZhao\My.class
JianZhiOffer.ErWeiShuZuZhongDeChaZhao.My
成功返回了类名
在加载器中放入自己加载的路径。
在加载的时候输入包名.类名
即可进行加载