黑马程序员技术交流社区

标题: 有关ClassLoader的几个问题 [打印本页]

作者: litaojisuanji    时间: 2014-1-11 18:58
标题: 有关ClassLoader的几个问题
本帖最后由 litaojisuanji 于 2014-1-14 01:09 编辑

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



作者: 几番意难相付    时间: 2014-1-12 15:26
loadClass 默认调用当前类加载器
        的父类加载器
        来加载某个类
        如果该类的父类还有父类
        继续这个逻辑
        该方法被jvm调用
findClass 被loadClass方法调用 直接调用某个类
defineClass 将某个类的字节码文件 读入到一个字节数组中

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


作者: 疯狂的土贼    时间: 2014-1-12 16:50
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的区别(我以前看过 推荐给你 希望对你有帮助 附图 你看看加深印象)








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