`

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调入到内存中,再实例化对象是没有意义的。

分享到:
评论

相关推荐

    Java Class.forName()用法和newInstance()方法原理解析

    主要介绍了Java Class.forName()用法和newInstance()方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java 反射(Reflection) 经典实用例子

    Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中...

    Java 高级特性.doc

    String obj = (String)Class.forName("java.lang.String").newInstance(); 这是制造另一个章:Class.forName("java.lang.Integer") --------------------- 讲Constructor://构造方法 Constructor constructors[]...

    JAVA核心知识点整理(有效)

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

    Java 面试宝典

    11、"=="和 equals 方法究竟有什么区别? ................................................................. 12 12、静态变量和实例变量的区别? ...............................................................

    JDBC访问数据库的步骤

    1. Load the Driver:Class.forName(); 2. Connect the DateBase: DriveManager.getConnection() 3. Execute the SQL: (1) Connection.createStatement() Connection.prepareStatement(sql) (2)Statement....

    JDT生成代码实例

    //使用方法实例创建表达类型 ExpressionStatement statement2 = ast.newExpressionStatement(methodInvocation2); //将表达式添加到语句块 mainBlock.statements().add(statement2); } //构造方法 { //...

    spring01_jdbc

    对比一下,如果我们用下面的Class.forName的方式,则相当于重新读取的是一个字符串。那么就会运行时异常。解决方案的思路:第一步:用反射来创建对象,避免使用new关键字DriverManager . deregisterDriver( new ...

    day021-反射和注解笔记和代码.rar

    1.1 Class clazz = Class.forName(全限定路径名) (最多使用)默认就是调用下面的方法 1.2 static 类<?> forName(String name, boolean initialize, ClassLoader loader) name:全限定路径名 ...

    Ant 1.9.2 API (CHM格式)

    注: FileSet的setIncludes, 和setExcludes方法输入pattern, pattern是一个使用“,”或空格分隔的匹配字符串,其中, “**”代表所有文件或目录,“*.*”代表说有文件, “*.java”代表所有扩展名为java的文件。...

    JDBC详解HTML-JDBC.pp

    <2>.Class.forName(driver).newInstance() <3>.new driver() 2>.取得数据库连接(Connect to the DataBase) <1>.用DriverManager取数据库连接 Connection cn = DriverManager.getConnection(url,uid,pwd); <2>....

    API精灵源码(C#编)

    API精灵 FOR C# 开始设计日期 2004.03.06 设计目的:简单快速对C#中使用的API函数进行查询,并给出调用代码 设计进度: 2004.03.09 完成对<函数类>的查询功能,包括 代码调用,中文注释,所需的DLL库,与C#中...

    ZendFramework中文文档

    14.1.3. 使用静态 get() 方法 14.2. 标准过滤器类 14.2.1. Alnum 14.2.2. Alpha 14.2.3. BaseName 14.2.4. Digits 14.2.5. Dir 14.2.6. HtmlEntities 14.2.7. Int 14.2.8. RealPath 14.2.9. StringToLower...

    Java 反射机制的应用

    类)的路径,我们可以利用 Class.forName() 方法获取到给的的类,然后通过调用该类的 newInstance() 方法实例化此类的对象,这样就取代了使用 new 关键字实例化对象的操作方式。 通过调用类的 newInstance() 方法...

    C#图书馆管理信息系统

    /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System....

    c#实例135 如何扫描端口

    /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// private void InitializeComponent() { this.label1 = new System.Windows.Forms.Label(); this.textBox1 = new System.Windows...

    JAVA连接ORACLE数据库方法及测试

    /* 使用Class.forName()方法自动创建这个驱动程序的实例且自动调用DriverManager来注册它 */ Class.forName(driver); /* 通过DriverManager的getConnection()方法获取数据库连接 */ conn = ...

Global site tag (gtag.js) - Google Analytics