您的位置:首页 > 其它

JVM虚拟机加载类到内存的ClassLoader.loadClass && Class.forName()的比较

2014-08-17 11:29 453 查看
最近看了一些关于Class加载方式的资料,关于JVM类加载机制的,这也是面试经常被问到的题目。

Java虚拟机加载类的可以通过Class.forName()和ClassLoader.loadClass()两种方式加载类到内存。不同的是主要有以下几点:

1.都有两个方法去加载类:

1.1 前者Class的两个重载方法:

1. public static Class<?> forName(String className) throw ClassNotFoundException;

解析:参数className 是类的全限定名,如Object类在源文件中的全限定名为Java.lang.Object,即包名加类名

通过Clas.forName("java.lang.Object"),加载类。

该方法默认对未被初始化的类进行初始化,从加载----链接----初始化;

2. public static Class<?> forName(String className, boolean initialize, ClassLoader loader) throw ClassNotFoundException;[code]		解析:多了两个参数,一个是:是否进行初始化,第二个是用于加载类的指定加载器,为空说明采用引导类加载器(bootstrap);只有 [code]initialize
参数为
true
且以前未被初始化时,才初始化该类。[/code]

1.2 后者ClassLoader.loadClass的两个重载方法:

1. protected synchronized Class<?> loadClass(String className, boolean resolve)throws ClassNotFoundException;
解析:ClassName同样是类全限定名,resolve 表示是否进行连接操作,是(加载---连接---初始化)中的连接还没有初始化。
2. public Class<?> loadClass(String className) throws ClassNotFoundException;
解析:这里的是否连接默认为fasle;

2. 是否能够初始化类:

ClassLoader.loadClass不会对类进行初始化,只能确定是否连接,而Class.forName会对类进行初始化,同时可以传递一个CLassLoader类加载器去加载该类。

总之,类从加载----连接(验证-准备-解析)--初始化的过程,是有先后顺序的,以上两种加载方式主要就是能否初始化类的区别。

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: