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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张 涛 中级黑马   /  2012-9-13 11:51  /  3191 人查看  /  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 个回复

倒序浏览
模板方法设计模式:
父类里有loadClass方法,不管哪个子类,它们loadClass过程是一样的,自己干的代码不一样。
所以覆盖的不是loadClass而是findClass方法。得到Class文件中二进制数据,用defineClass()把Class文件转换成字节码。
通俗的讲就是张老师说的爸爸的问题,类加载器都有自己的父类。loadClass方法是先找他的爸爸,如果爸爸干不了,就找findClass方法自己完成加载。
findClass方法是直接自己完成加载,得到Class文件的二进制数据,再用defineClass把Class文件转换成字节码,不找他的父类加载器
回复 使用道具 举报
loadClass方法的默认实现将按以下顺序搜索类
调用 findLoadedClass(String) 来检查是否已经加载类。
在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。
调用 findClass(String) 方法查找类。
如果使用上述步骤找到类,并且 resolve 标志为真,则此方法将在得到的 Class 对象上调用 resolveClass(Class) 方法。
鼓励用 ClassLoader 的子类重写 findClass(String),而不是使用此方法。
回复 使用道具 举报
类加载器的原理,自己查了些文档,看是否是这么回事?

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