您的位置:首页 > 其它

Class.forName

2015-09-10 17:11 363 查看
在java数据库开发中会经常遇到
Class.forName
.
Class.forName()
返回的是一个类,它的作用是要求JVM查找并动态加载指定的类,也就是说JVM会执行该类的静态代码段.在实例化对象的时候会用到
Class.forName()
:

/*这两个效果是一样的*/
POM pom = (POM)Class.forName("xxx.xxx.xx").newInstance();   //返回的是object
POM pom = new POM();


注:静态代码是和类绑定的,class装载成功就表示执行了静态代码段,并且以后不再执行这段静态代码段.
newInstance()
是一个方法;
new
是一个关键字

newInstance()
生成的对象只能调用无参的构造函数;
new
出来的对象没有这个限制.
newInstance()
使用类加载机制创建对象;
new
创建一个新的类来创建对象
.
newInstance
弱类型,低效率,只能调用无参构造;
new` 强类型,相对高效,能调用任何public构造.
newInstance()
实际上是把
new
这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。这样可以在调用class的静态加载方法
forName
时获得更好的灵活性,提供了一种降耦的手段。

forName(String className)
(
initialize =  true
)

a.总是使用当前类加载器(即装载执行
forName()
请求的类的类装载器)

b.总是初始化个被装载的类

forName(String className, boolean initialize, ClassLoader loader)


a.
initialize = true
时,连接并初始化

b.
loader
指定装载参数类所用的类装载器,如果null则用bootstrap

c.false时,绝对不会初始化,但是可能被连接了,有个例外,如果在调用这个
forName()
前,已经被初始化了,那么返回的类型也肯定是被初始化的

loadClass(String name)
单参数时,
resolve=false


a.如果该类已经被该类装载器所装载,那么,返回这个已经被装载的类型的Class的实例,否则,就用这个自定义的类装载器来装载这个class,这时不知道是否被连接,绝对不会被初始化。

b.这时唯一可以保证的是,这个类被装载了。但是不知道这个类是不是被连接和初始化了

loadClass(String name, boolean resolve)


a.
resolve=true
时,则保证已经装载,而且已经连接了。
resolve=falses
时,则仅仅是去装载这个类,不关心是否连接了,所以此时可能被连接了,也可能没有被连接。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: