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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© litaojisuanji 高级黑马   /  2014-1-11 18:58  /  1467 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 litaojisuanji 于 2014-1-14 01:09 编辑

loadClass(String name)                      findClass(String name)
defineClass(String name,byte[] b,int off,int len)
这三个方法的有什么作用,都有什么关系,写了一类加载器要继承ClassLoader,需要重写哪些方法,不需要重写哪些方法,为什么?


评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 淡定

查看全部评分

2 个回复

倒序浏览
loadClass 默认调用当前类加载器
        的父类加载器
        来加载某个类
        如果该类的父类还有父类
        继续这个逻辑
        该方法被jvm调用
findClass 被loadClass方法调用 直接调用某个类
defineClass 将某个类的字节码文件 读入到一个字节数组中

如果要定义一个自定义类加载器
建议复写findClass方法
首先 defineClass方法是被final 关键字修饰的 也就是无法被复写 它也不需要被复写
然后 loadClass方法会先从当前加载器的父加载器中尝试加载某个类 当父加载器无法加载这个类时 当前的加载器才会加载类 如果复写了loadCLass方法 则需要在loadClass方法中实现这些逻辑 非常麻烦。
所以 自定义类加载器 最佳的方式就是复写findclass方法;

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 很给力!

查看全部评分

回复 使用道具 举报
ClassLoader基本概念
JVM在运行时会产生三个ClassLoader,Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader.AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent为Bootstrap ClassLoader。
Bootstrap是用C++编写的,我们在Java中看不到它,是null。它用来加载核心类库
Extension ClassLoader用来加载扩展类,即%/lib/ext中的类。
最后AppClassLoader才是加载Classpath的。
Java提供了抽象类ClassLoader,所有用户自定义类装载器都实例化自ClassLoader的子类。 System Class Loader是一个特殊的用户自定义类装载器,由JVM的实现者提供,在编程者不特别指定装载器的情况下默认装载用户类。系统类装载器可以通过ClassLoader.getSystemClassLoader() 方法得到。

简单点讲:
bootstrap Class Loaders负责装载java.*下的基本类  
extension Class Loaders负责装载javax.*下的类  
system Class Loaders负责系统(用户)实现的类

三者的关系是   bootstrap class loaders是extension class loaders的父亲  extension class loaders是system class loaders的父亲    class loader的装载机制是parent delegate的模型。即   类的装载是委托给父class loader去查找,如果没有找到才用当前的class loader来查找。

2、findClass(String name) 调用当前某个类

findClass 被loadClass方法调用 也可以直接调用某个类

3、defineClass(String name,byte[] b,int off,int len)

将某个类的字节码文件 读入到一个字节数组中 (楼上正解)但是还是建议你在看看手册中的具体用法 很详细


小结下:这几个类大多用在 实现类的加载              只是相对加载的方式有所区别罢了 理解上应该不困难 以上如果还有什么不明白 您可以继续问
帮你找了下相关的资料 这个我以前看到过
http://blog.csdn.net/fenglibing/article/details/17471659 文章题目是 实现自己的类加载时,重写方法loadClass与findClass的区别(我以前看过 推荐给你 希望对你有帮助 附图 你看看加深印象)



评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马