在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
时,则仅仅是去装载这个类,不关心是否连接了,所以此时可能被连接了,也可能没有被连接。