黑马程序员技术交流社区

标题: 关于loadclass和findclass的再研究 [打印本页]

作者: 张 涛    时间: 2012-9-14 09:49
标题: 关于loadclass和findclass的再研究
本帖最后由 张 涛 于 2012-9-14 15:49 编辑

昨天,在看张老师讲的类加载器,最后实现自己的一个类加载器时,很郁闷,对loadclass和findclass,这两个方法理解很模糊,网上查了查也是说的不太明白,这两个方法不明白,自己实现的加载器的原理就无法理解,过程也无法把握。

不过,最后还是想出了一个办法,这个办法以后会解决很多问题,就是查源码,查jdk的源码。于是,昨天晚上,进行再研究,终于明白了这两个方法的关系,以及自己实现classLoader的原理。
代码如下,我已经加了注释。
  1. //loadClass方法,里面调用另一个方法,并加入了一个属性
  2. public Class<?> loadClass(String name) throws ClassNotFoundException {
  3. return loadClass(name, false);
  4.     }
  5. //被调用的另一个方法
  6.     protected synchronized Class<?> loadClass(String name, boolean resolve)
  7. throws ClassNotFoundException
  8.     {
  9. //首先检查有没有已经存在的class
  10. // First, check if the class has already been loaded
  11. Class c = findLoadedClass(name);
  12. //如果没有,再做以下处理
  13. if (c == null) {
  14.      try {
  15.   //检查有没有父类,有的话,继续
  16.   if (parent != null) {
  17.   //调用父类的loadClass方法
  18.       c = parent.loadClass(name, false);
  19.   } else {
  20.   //没有父类,调用其他方法
  21.       c = findBootstrapClassOrNull(name);
  22.   }
  23.   //两者都没有搞定,抛找不到异常
  24.      } catch (ClassNotFoundException e) {
  25.                 // ClassNotFoundException thrown if class not found
  26.                 // from the non-null parent class loader
  27.         }
  28.   //如果c还是null,调用自己的findClass方法
  29.   if (c == null) {
  30.   // If still not found, then invoke findClass in order
  31.   // to find the class.
  32.   c = findClass(name);
  33.      }
  34. }
  35. //如果此标识为true,分析该类
  36. if (resolve) {
  37.      resolveClass(c);
  38. }
  39. //返回
  40. return c;
  41.     }
复制代码
自己实现加载器的原理就是,调用classloader方法,该方法分三步执行,第一步查看是否已加载,第二步交给父类去加载,最后自己加载。而我们对要加载的class文件进行了加密处理,所以第一步和第二步是无法搞定的,只好用第三步,而第三步,我们重写了findclass方法,在该方法中,把拿到的class解密再返回即可。

昨天发的贴的理解都是有偏差的,今天应该对了吧,哈哈!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2