`
antxman
  • 浏览: 40888 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Class.forName("...")与Class.forName("...").newInstance()区别

阅读更多
Demo   d   =   new   DerivedDromDemo();     //写代码编译时就确定了。

Demo   d   =   Class.forName( "DerivedFromDemoButWeCantKnowHisName ").newInstance();   //   运行时再来,这个类名字可以计算得出,比如读取配置文件,只要他能完成   Demo   d   =   (Demo)   instance;操作就行。


Java   中很多     Spi   工厂类都是这种方式工作,
public   abstract   class   Factory   {
      public   static   Factory   getInstance(String   name){
            //   读取配置文件,查找信息。
          InputStream   in   =   Thread.getContextClassLoader().getResourceAsStream( "/config.properties ");

          Properties   config   =   new   Properties();
            config.load(in);
     
          String   clazz   =   config.getProperty(name);

//读到了一个工厂类完成具体事情,   这个类应该实现了   抽象业务方法,比如下面的   createSession();   这样就能让你的这些代码已经写好的情况下,如果以后要扩展功能,你只需要在配置文件里添加,然后   使用   Factory.getInstace( "NewImplementationFactory ")   这种方式就可以工作了。
          Factory   instance   =   (Factory)   Class.forName(clazz).newInstance());
       
  return   instance;
      }

    public   abstract   Session   createSession();
}

还有一种情况比较常见,那就是   类库版本兼容性问题,比如   1.3   提供一个类,1.2   没有提供需要打补丁,那么可以   用   Class.forName()   运行时来探测存在版本,因为编译时并没有实际调用而是使用   Class.forName( 'xxx ').getMethod( 'name ').invoke(new   Object[])这样的方式去调用,编译通过运行时还是要确保这个方法能找到,但是给了我们一个机会:当这个方法没有找到是我们想点别的办法,而不是让   JVM   抛出   ClassNotFoundException   或   NoClassDefError   错误。     如果不用   Class.forName   那么只要这个类找不到那么程序根本没有办法运行,你没有机会控制它的流程而只有清理现场退出了。
分享到:
评论

相关推荐

    Class.forName

    下面将详细解释`Class.forName()`的工作原理、用途及其与`new`关键字的区别。 `Class.forName(String className)`方法接收一个字符串参数,这个字符串代表了类的全限定名(包括包名和类名)。当调用此方法时,JVM会...

    class literal & instance.getClass() & Class.forName(String className)

    在Java编程语言中,"class literal"、"instance.getClass()" 和 "Class.forName(String className)" 是三个与类加载和类型查询紧密相关的概念。了解这些概念对于深入理解Java运行时的类加载机制至关重要。 首先,让...

    Class.forName()_newInstance()_New_三者区别

    在Java编程中,`Class.forName()`, `newInstance()` 和 `new` 关键字都是与对象创建和类加载紧密相关的概念,但它们各自有着不同的用途和限制。 首先,`Class.forName("className")` 是一个静态方法,它用于在运行...

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

    Java Class.forName()用法和newInstance()方法原理解析 Class.forName()方法是Java语言中的一种Class加载机制,它可以根据类名将对应的类加载到JVM中,同时也可以实例化该类。Class.forName()方法的主要功能是要求...

    java中Class.forName的作用浅谈

    下面我们将深入探讨`Class.forName()`的用途、工作原理以及与`new`关键字的区别。 一、`Class.forName()`的用途 1. **动态加载类**:当需要在程序运行时根据某些条件或用户输入来决定加载哪个类时,`Class.forName...

    jdbc驱动程序实例

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl为数据库的SID String user = "test"; String password = "test"; Connection ...

    Classfor的用法

    `Class.forName` 经常与 `newInstance` 方法配合使用,以实现动态创建对象的目的。`newInstance` 方法用于创建 `Class` 对象所表示的类的实例。 **示例**: ```java try { Class<?> clazz = Class.forName(...

    liuwei1989#study-guide#17-Class.forName和classloader的区别1

    并且只有调用了newInstance()方法采用调用构造函数,创建类的对象看下Class.forName()源码//Class.forName(String c

    java于各种数据库连接额语句

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl 为数据库SID String user = "test"; String password = "test"; ...

    jdbc笔记整理 sql

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000 数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2 数据库 Class.froName(...

    forname实现工程内部反射机制

    在“forname实现工程内部反射机制”这个主题中,我们将深入探讨如何利用`Class.forName()`方法来实现对工程内部类的动态访问。 首先,让我们了解`Class.forName()`的基本用法。这个方法接收一个字符串参数,该参数...

    excel的jdbc驱动

    Class.forName(driver).newInstance(); Connection con = DriverManager.getConnection(url); Statement stm = con.createStatement(); String sql = "select * from sheet"; for(int i=0;i;i++){ ResultSet ...

    mysql-connector-java-3.0.14-production-bin.jar

    mysql4.1.10的JDBC驱动 把它拷贝到你的web应用的WEB-INF\lib下(当然也可以设置CLASSPATH) <br>接着修改程序代码: 将你的: Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 改为: ...

    access jar驱动连接数据库

    access jar驱动连接数据库

    new关键字和newInstance() 的区分

    例如,`A a = (A) Class.forName("pacage.A").newInstance();` 就是使用 newInstance() 方法创建了一个 A 类的对象。newInstance() 方法的作用是加载一个类,并创建一个新的对象。 从本质上讲,new 关键字和 new...

    Java反射简单例子

    首先,我们从`Class.forName()`方法开始。这是Java反射机制的一个关键入口点,它用于根据全限定类名(包括包名)加载类。例如,如果我们有一个名为`Robot`的类,我们可以使用以下代码加载它: ```java Class<?> ...

    JDBC访问数据库步骤

    * Oracle 数据库(thin 模式):`Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();` * SQL Server 数据库:`Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();` * ...

    使用JDBC连接各种数据库总结

    - Oracle:`Class.forName("oracle.jdbc.driver.OracleDriver").newInstance()` - SQL Server:`Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance()` - DB2:`Class.forName(...

    java数据库连数语法

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; String user = "test"; String password = "test"; Connection conn = ...

    java连接oracle,db2,MySQL,sqlserver等数据库的方式.pdf

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; String user = "test"; String password = "test"; Connection conn = ...

Global site tag (gtag.js) - Google Analytics