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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨兴庭 于 2013-7-14 18:22 编辑

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

评分

参与人数 1黑马币 +3 收起 理由
杨兴庭 + 3 赞一个!

查看全部评分

3 个回复

倒序浏览
用forName加载用的是加载主函数所在类的加载器,一般都是AppClassLoader,用类加载器的话可以指定加载器去加载。
回复 使用道具 举报
类装载器装载是指定装载器,forname是使用当前类装载器装载。
回复 使用道具 举报
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,这就是一个程序最基本的加载流程

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

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