A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张 涛 中级黑马   /  2012-9-13 11:51  /  3283 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张 涛 于 2012-9-14 09:51 编辑

张老师讲classLoader时,讲抽象类ClassLoader里的loadClass方法和findClass方法,讲的听不懂啊,也就是类加载器的原理,六分钟视频那个,没听懂。

高手给讲讲啊!!!
=====================================================================

类加载器的原理,自己查了些文档,看是否是这么回事?

1.派当前线程的类加载器加载class文件,首先该类用方法:class findclass(String str); 看该类是否已经加载,如果加载了,返回加载过的class。没有呢,返回null。
2.如果返回null,需要加载,他就把这个任务给自己的父类,父类给父类,一直到bootStrap。父类加载器去加载,此时判断自己的管辖范围,如果不属于自己的管辖范围,父类不加载,返回null。
3.父类又把任务交给子类,这样一直给到最开始加载类的加载器,他再加载,如果他也加载不了,返回错误。
4.如果加载了返回Class文件。



评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

3 个回复

正序浏览
类加载器的原理,自己查了些文档,看是否是这么回事?

1.派当前线程的类加载器加载class文件,首先该类用方法:class findclass(String str); 看该类是否已经加载,如果加载了,返回加载过的class。没有呢,返回null。
2.如果返回null,需要加载,他就把这个任务给自己的父类,父类给父类,一直到bootStrap。父类加载器去加载,此时判断自己的管辖范围,如果不属于自己的管辖范围,父类不加载,返回null。
3.父类又把任务交给子类,这样一直给到最开始加载类的加载器,他再加载,如果他也加载不了,返回错误。
4.如果加载了返回Class文件。
回复 使用道具 举报
loadClass方法的默认实现将按以下顺序搜索类
调用 findLoadedClass(String) 来检查是否已经加载类。
在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。
调用 findClass(String) 方法查找类。
如果使用上述步骤找到类,并且 resolve 标志为真,则此方法将在得到的 Class 对象上调用 resolveClass(Class) 方法。
鼓励用 ClassLoader 的子类重写 findClass(String),而不是使用此方法。
回复 使用道具 举报
模板方法设计模式:
父类里有loadClass方法,不管哪个子类,它们loadClass过程是一样的,自己干的代码不一样。
所以覆盖的不是loadClass而是findClass方法。得到Class文件中二进制数据,用defineClass()把Class文件转换成字节码。
通俗的讲就是张老师说的爸爸的问题,类加载器都有自己的父类。loadClass方法是先找他的爸爸,如果爸爸干不了,就找findClass方法自己完成加载。
findClass方法是直接自己完成加载,得到Class文件的二进制数据,再用defineClass把Class文件转换成字节码,不找他的父类加载器
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马