本帖最后由 张 涛 于 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解密再返回即可。
昨天发的贴的理解都是有偏差的,今天应该对了吧,哈哈!
|