The Difference of Class.forName()、Class.forName().newInstance() and New in Java

来源:互联网 发布:极客学院大数据怎么样 编辑:程序博客网 时间:2024/06/10 11:02

 在一次偶然的跟同行交流的过程中,突然被问及Class.forName()、Class.forName().newInstance() 、New的区别,一时懵了, 竟然在java开发中最常见的一些东西竟说不清道不明的感觉,很不是滋味,于是下来仔细search了一番:

Class.forName( ): Class.forName("")返回的是类

forName()静态方法的目的是为了让JVM动态加载指定的类。在加载完成后,还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此单使用Class.forName( )动态加载类是没有用的,其最终目的是为了实例化对象。

Class下的newInstance() 返回的是object

newInstance() 的使用有局限,因为它生成对象只能调用无参的构造函数,而使用new关键字生成对象没有这个限制。

有一个问题是:为什么在我们加载数据库驱动包的时候有的却没有调用newInstance( )方法呢?而有的又调用了newInstance()?

因为在JDBC规范中明确要求Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下:
  public class MyJDBCDriver implements Driver {
   static {
       DriverManager.registerDriver(new MyJDBCDriver());
   }
  }
可以看出在静态初始化器中已经进行了注册,所以在调用Class.forName( )加载类的时候,静态初始化器代码段就会被执行,使用JDBC时只需要Class.forName()就可以了。

 

Class.forName(), .class 与 .getClass() 区别:

1、Class.forName() 是一个静态方法,JVM动态的加载指定全类名的class到JVM中,.class是java中所有类的一个属性,.getClass()是所有对象的成员方法;

如:System.out.println(Integer.class); // class java.lang.Integer

System.out.println(new Integer(10).getClass()); // class java.lang.Integer

2、