黑马程序员技术交流社区

标题: 求教反射加载类与类加载器加载类的区别 [打印本页]

作者: llwttkl598    时间: 2013-7-13 08:35
标题: 求教反射加载类与类加载器加载类的区别
本帖最后由 杨兴庭 于 2013-7-14 18:22 编辑

反射加载类使用forname 与类加载器使用ClassLoader的区别在哪里呀?求教哇。

作者: 王靖远    时间: 2013-7-13 09:32
用forName加载用的是加载主函数所在类的加载器,一般都是AppClassLoader,用类加载器的话可以指定加载器去加载。
作者: 王海旺    时间: 2013-7-13 22:07
类装载器装载是指定装载器,forname是使用当前类装载器装载。
作者: 董凯    时间: 2013-7-14 16:35
Class.forName是从指定的classloader中装载类,如果没有指定,也就是一个参数的时候,是从装载当前对象实例所在的classloader中装载类.
      而ClassLoader的实例调用loadclass方法,是指从当前ClassLoader实例中调用类,而这个实例与装载当前所在类实例的Classloader也许不是同一个.


1.Class.forName返回的Class对象可以决定是否初始化。而ClassLoader.loadClass返回的类型绝对不会初始化,最多只会做连接操作。
2.Class.forName可以决定由哪个classLoader来请求这个类型。而ClassLoader.loadClass是用当前的classLoader去请求。



ClassLoader


bootstrap classloader(启动类加载器)
>>这个ClassLoader在JVM运行的时候加载java核心的API以满足java程序最基本的需求,其中就包括用户定义的ClassLoader


通过java程序实现的ClassLoader:
>>ExtClassLoader : 这个ClassLoader是用来加载java的扩展API的,也就是/lib/ext中的类.
>>AppClassLoader : 这个 ClassLoader是用来加载用户机器上CLASSPATH设置目录中的Class的,通常在没有指定ClassLoader的情况下,程序员自定义的类就由该ClassLoader进行加载.


程序运行: 

当运行一个程序的时候,JVM启动,运行bootstrap classloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程




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