黑马程序员技术交流社区

标题: 在写类加载器时,继承findClass比loadClass更优越 [打印本页]

作者: 王毛毛    时间: 2011-9-29 08:30
标题: 在写类加载器时,继承findClass比loadClass更优越
在写类加载器时,继承findClass比loadClass更优越,优越在哪?
作者: 匿名    时间: 2011-9-29 08:48
应该不是继承的吧,应该覆盖的吧
loadClass方法有到父类找类的实现(委托机制)
如果你覆盖它,如果还想保留类加载器的委托机制的话,就需要自己写代码实现
如果覆盖的是findClass,程序就继承父类的loadClass(即保留了委托机制)
ps:loadClass内部会调用findClass
写得有点拗口
详情参看高新技术视频     45_自定义类加载器的编写原理分析.avi
作者: 曾公亮    时间: 2011-9-29 08:59
loadClass方法的默认实现将按以下顺序搜索类
调用 findLoadedClass(String) 来检查是否已经加载类。
在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。
调用 findClass(String) 方法查找类。
如果使用上述步骤找到类,并且 resolve 标志为真,则此方法将在得到的 Class 对象上调用 resolveClass(Class) 方法。
鼓励用 ClassLoader 的子类重写 findClass(String),而不是使用此方法。

文档上这样写的,希望对你在帮助。

在loadClass内部就会调用findClass方法
[ 本帖最后由 曾公亮 于 2011-09-29  09:01 编辑 ]
作者: 匿名    时间: 2011-9-29 15:35
findClass
protected Class<?> findClass(String name)
                      throws ClassNotFoundException使用指定的二进制名称查找类。此方法应该被类加载器的实现重写,该实现按照委托模型来加载类。在通过父类加载器检查所请求的类后,此方法将被 loadClass 方法调用。默认实现抛出一个 ClassNotFoundException。


参数:
name - 类的二进制名称
返回:
得到的 Class 对象
抛出:
ClassNotFoundException - 如果无法找到类



loadClass
public Class<?> loadClass(String name)
                   throws ClassNotFoundException使用指定的二进制名称来加载类。此方法使用与 loadClass(String, boolean) 方法相同的方式搜索类。Java 虚拟机调用它来分析类引用。调用此方法等效于调用 loadClass(name, false)。


参数:
name - 类的二进制名称
返回:
得到的 Class 对象
抛出:
ClassNotFoundException - 如果没有找到类




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