学习自
https://blog.csdn.net/seu_calvin/article/details/52315125
为什么需要自定义类加载器?
1.代码安全
把自己的代码加密,然后自定义类加载器的时候解密
2.支持多来源
比如类在云端,可以自定义类加载器到某个url里下载
双亲委托模型是怎么工作的?
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// 检查这个类是否已经被加载过了
Class<?> c = findLoadedClass(name);
if (c == null) {
try {
//交给父类或者启动类加载器去加载
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
}
//自己加载
if (c == null) {
c = findClass(name);
}
}
return c;
}
这个模型的优点:
1.我们应用层写不出一个可以覆盖比如Object的Object类。因为我们包下的Object类,上层类加载器是不受理的
我们自定义类加载器自然是最好遵循双亲委托模型,所以重新findClass即可。
protected Class<?> findClass(String name) throws ClassNotFoundException
{
File file = new File("D:/People.class");
try{
byte[] bytes = getClassBytes(file);
//defineClass方法可以把二进制流字节组成的文件转换为一个java.lang.Class
Class<?> c = this.defineClass(name, bytes, 0, bytes.length);
return c;
}
catch (Exception e)
{
}
return super.findClass(name);
}
核心方法是defineClass, 作用是:二进制流——>字节码——>Class对象