Class.forName

来源:互联网 发布:c 内存分配 未赋值数组 编辑:程序博客网 时间:2024/05/16 05:22

在java数据库开发中会经常遇到Class.forName.

Class.forName() 返回的是一个类,它的作用是要求JVM查找并动态加载指定的类,也就是说JVM会执行该类的静态代码段.

在实例化对象的时候会用到Class.forName():

/*这两个效果是一样的*/POM pom = (POM)Class.forName("xxx.xxx.xx").newInstance();   //返回的是objectPOM 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时,则仅仅是去装载这个类,不关心是否连接了,所以此时可能被连接了,也可能没有被连接。

0 0
原创粉丝点击