【JAVA】Class.forName用法以及和new的区别
来源:互联网 发布:在淘宝开网店赚钱吗 编辑:程序博客网 时间:2024/05/17 06:23
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调入到内存中,再实例化对象是没有意义的
- 【JAVA】Class.forName用法以及和new的区别
- java Class.forName和new 的区别
- new和Class.forName()的区别
- Class.forName()用法及与new的区别
- Class.forName()、Class.forName().newInstance() 和 New 区别
- class.forname()和new的区别和作用
- Class.forName()和new和Instantiation()区别
- Class.forName().newInstance()和通过new得到对象的区别
- Class.forName new 区别
- MySQL JDBC驱动 - Class.forName和java.sql.DriverManager.registerDriver(new Driver())的区别
- Class.forName()与new关键字的区别
- 【转】Class.forName 与 new 的区别
- class.forName() 和new
- JAVA Class.forName和.class区别
- Class.forName和New的比较
- Class.forName和New的比较
- Class.forName和New的比较
- Class.forName和new的比较
- Android4: 动态切换界面风格
- /*题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
- hibernate的级联、延迟加载、inverse属性
- 策略模式与工厂模式比较
- Binding(一)——Binding基础
- 【JAVA】Class.forName用法以及和new的区别
- Problem 60 关于解决X11的错误的问题?
- CASE WHEN ELSE END的一个用法
- C++ strings(字符串)详解
- HDOJ 1114 Piggy-Bank
- 基于FMS(Flash Media Service)的多人视频聊天
- 为什么要配置环境变量
- Linux下检测网卡与网线连接状态,使用ioctl向socket发送SIOCETHTOOL命令字
- ORCAL 空值