黑马程序员技术交流社区
标题:
关于loadclass和findclass的再研究
[打印本页]
作者:
张 涛
时间:
2012-9-14 09:49
标题:
关于loadclass和findclass的再研究
本帖最后由 张 涛 于 2012-9-14 15:49 编辑
昨天,在看张老师讲的类加载器,最后实现自己的一个类加载器时,很郁闷,对loadclass和findclass,这两个方法理解很模糊,网上查了查也是说的不太明白,这两个方法不明白,自己实现的加载器的原理就无法理解,过程也无法把握。
不过,最后还是想出了一个办法,这个办法以后会解决很多问题,就是查源码,查jdk的源码。于是,昨天晚上,进行再研究,终于明白了这两个方法的关系,以及自己实现classLoader的原理。
代码如下,我已经加了注释。
//loadClass方法,里面调用另一个方法,并加入了一个属性
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
//被调用的另一个方法
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
//首先检查有没有已经存在的class
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
//如果没有,再做以下处理
if (c == null) {
try {
//检查有没有父类,有的话,继续
if (parent != null) {
//调用父类的loadClass方法
c = parent.loadClass(name, false);
} else {
//没有父类,调用其他方法
c = findBootstrapClassOrNull(name);
}
//两者都没有搞定,抛找不到异常
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
//如果c还是null,调用自己的findClass方法
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
//如果此标识为true,分析该类
if (resolve) {
resolveClass(c);
}
//返回
return c;
}
复制代码
自己实现加载器的原理就是,调用classloader方法,该方法分三步执行,第一步查看是否已加载,第二步交给父类去加载,最后自己加载。而我们对要加载的class文件进行了加密处理,所以第一步和第二步是无法搞定的,只好用第三步,而第三步,我们重写了findclass方法,在该方法中,把拿到的class解密再返回即可。
昨天发的贴的理解都是有偏差的,今天应该对了吧,哈哈!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2