Class.forName用法以及和new的区别

Class.forName是用来获取Class的类类型
例如:class myclass
{
int Point;
public static void main(String[] args)
{

Class obj=Class.forName(myclass);
System.out.println(obj.getClassName());
//输出为"myclass";
}
}
用到数据库就是用来加载驱动。
例如:用sql数据库建立jdbc-odbc桥
Class.forName("sun.Jdbc.Odbc.JdbcOdbc");
创建连接
Connection=DriverManager.getConnection("jdbc:odbc:ODBC");
ODBC为你建立的ODBC名

比如:
Class c =Class.forName("ss.dd.bb.Bean");
Bean b = c.newInstace();
和 Bean b = new Bean();效果一样

但是:forName("ss.bb.bean"), JVM会在classapth中去找对应的类,设定在classpath的类,在java启动的时候最先被加载,并将Class对象保存起来,这样forName创建对象时就不需要通过classloader再去读取该类的文件了。而new 一个对象,一般不需要该类在classpath中设定,但可能需要通过classlaoder来加载。
当你确定此时内存中没有这个对象的时候,你就可以用class.forName();来创建一个对象,而假如new是不管你内存中是否有这个对象都会创建一个新的对象,也是说会在内存中开辟一个新的内存空间!

【用法】

  Class aClass = Class.forName(xxx.xx.xx);
  Object anInstance = aClass.newInstance();
  Class.forName("").newInstance()返回的是object
  but there is some limit for this method to create instance
  that is your class constructor should no contain parameters, and you should cast the instance manually.

  Class Driver{
  protected static Driver current;
  public static Driver getDriver(){
  return current;
  }
  }
  Class MyDriver extends Driver{
  static{
  Driver.current=new MyDriver();
  }
  MyDriver(){}
  }
  用时:
  Class.forName("MyDriver");
  Driver d=Driver.getDriver();
  有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一些: Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢?
  Class.forName(xxx.xx.xx) 返回的是一个类,
  .newInstance() 后才创建一个对象
  Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
  在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下:
  public class MyJDBCDriver implements Driver {
  static {
  DriverManager.registerDriver(new MyJDBCDriver());
  }
  }
  所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了
  we just want to load the driver to jvm only, but not need to user the instance of driver, so call Class.forName(xxx.xx.xx) is enough, if you call Class.forName(xxx.xx.xx).newInstance(), the result will same as calling Class.forName(xxx.xx.xx), because Class.forName(xxx.xx.xx).newInstance() will load driver first, and then create instance, but the instacne you will never use in usual, so you need not to create it.
  在JDBC驱动中,有一块静态代码,也叫静态初始化块,它执行的时间是当class调入到内存中就执行(你可以想像成,当类调用到内存后就执行一个方法)。所以很多人把jdbc driver调入到内存中,再实例化对象是没有意义的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值