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()`的工作原理、用途及其与`new`关键字的区别。 `Class.forName(String className)`方法接收一个字符串参数,这个字符串代表了类的全限定名(包括包名和类名)。当调用此方法时,JVM会...
在Java编程语言中,"class literal"、"instance.getClass()" 和 "Class.forName(String className)" 是三个与类加载和类型查询紧密相关的概念。了解这些概念对于深入理解Java运行时的类加载机制至关重要。 首先,让...
在Java编程中,`Class.forName()`, `newInstance()` 和 `new` 关键字都是与对象创建和类加载紧密相关的概念,但它们各自有着不同的用途和限制。 首先,`Class.forName("className")` 是一个静态方法,它用于在运行...
Java Class.forName()用法和newInstance()方法原理解析 Class.forName()方法是Java语言中的一种Class加载机制,它可以根据类名将对应的类加载到JVM中,同时也可以实例化该类。Class.forName()方法的主要功能是要求...
下面我们将深入探讨`Class.forName()`的用途、工作原理以及与`new`关键字的区别。 一、`Class.forName()`的用途 1. **动态加载类**:当需要在程序运行时根据某些条件或用户输入来决定加载哪个类时,`Class.forName...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl为数据库的SID String user = "test"; String password = "test"; Connection ...
`Class.forName` 经常与 `newInstance` 方法配合使用,以实现动态创建对象的目的。`newInstance` 方法用于创建 `Class` 对象所表示的类的实例。 **示例**: ```java try { Class<?> clazz = Class.forName(...
并且只有调用了newInstance()方法采用调用构造函数,创建类的对象看下Class.forName()源码//Class.forName(String c
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl 为数据库SID String user = "test"; String password = "test"; ...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000 数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2 数据库 Class.froName(...
在“forname实现工程内部反射机制”这个主题中,我们将深入探讨如何利用`Class.forName()`方法来实现对工程内部类的动态访问。 首先,让我们了解`Class.forName()`的基本用法。这个方法接收一个字符串参数,该参数...
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 ...
mysql4.1.10的JDBC驱动 把它拷贝到你的web应用的WEB-INF\lib下(当然也可以设置CLASSPATH) <br>接着修改程序代码: 将你的: Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 改为: ...
access jar驱动连接数据库
例如,`A a = (A) Class.forName("pacage.A").newInstance();` 就是使用 newInstance() 方法创建了一个 A 类的对象。newInstance() 方法的作用是加载一个类,并创建一个新的对象。 从本质上讲,new 关键字和 new...
首先,我们从`Class.forName()`方法开始。这是Java反射机制的一个关键入口点,它用于根据全限定类名(包括包名)加载类。例如,如果我们有一个名为`Robot`的类,我们可以使用以下代码加载它: ```java Class<?> ...
* Oracle 数据库(thin 模式):`Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();` * SQL Server 数据库:`Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();` * ...
- Oracle:`Class.forName("oracle.jdbc.driver.OracleDriver").newInstance()` - SQL Server:`Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance()` - DB2:`Class.forName(...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; String user = "test"; String password = "test"; Connection conn = ...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; String user = "test"; String password = "test"; Connection conn = ...