Class.forName方法介绍
在java.lang.Class中,有两个重载的forName方法,分别是:
-
static Class<?>
forName(String className),该方法等价于Class.forName(className, true, this.getClass().getClassLoader())
-
static Class<?>
forName(String className
, boolean initialize,ClassLoader loader),其中3个参数分别表示:className - 所需类的完全限定名,initialize - 是否必须初始化类,loader - 用于加载类的类加载器。
forName方法的作用就是:
使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class
对象。给定一个类或接口的完全限定名,此方法会试图定位、加载和链接该类或接口。指定的类加载器用于加载该类或接口,如果参数loader
为 null,则该类通过引导类加载器加载。只有 initialize
参数为 true
且以前未被初始化时,才初始化该类。
其他的都很容易懂,就是当第二个参数为true时,到底初始化的是什么呢?可以通过下面这个例子来了解:
- package wen.hui.test.forname;
-
-
-
-
-
- public class TestClassForName {
-
- public static void main(String[] args) throws ClassNotFoundException {
- (new TestClassForName()).loadClass();
- }
-
- @SuppressWarnings("unchecked")
- public Class<Test> loadClass() throws ClassNotFoundException {
-
- Class<Test> clazz = (Class<Test>) Class.forName("wen.hui.test.forname.Test", true, getClass().getClassLoader());
- return clazz;
- }
-
- }
-
- class Test {
-
- static {
- System.err.println("类的静态初始化块");
- }
-
- public Test() {
- System.err.println("实例化类");
- }
-
- }
运行后,打印:类的静态初始化块
没错,Class.forName的第二个参数为true时,就是要求JVM在加载类后,初始化类的静态字段和静态块。
JDBC中使用Class.forName("xxx")的意义
在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过上面的介绍,已经了解了Class.forName()方法的作用就是为了动态加载类,并决定是否需要初始化类的静态部分,而在JDBC规范中明确要求Driver(数据库驱动)类必须向DriverManager注册自己。写到这里,相信大家都应该明白为什么在我们加载数据库驱动包的时候有的仅仅需要Class.forName(xxx);而有的需要Class.forName(xxx).newInstance()。
下面以MySQL为例子,来看看MySQL的com.mysql.jdbc.Driver类是怎么写的,MySQL的Driver类源码(5.x)
- public class Driver extends NonRegisteringDriver implements java.sql.Driver {
-
-
-
-
-
-
- static {
- try {
- java.sql.DriverManager.registerDriver(new Driver());
- } catch (SQLException E) {
- throw new RuntimeException("Can't register driver!");
- }
- }
-
-
-
-
-
-
-
-
-
-
- public Driver() throws SQLException {
-
- }
- }
在使用JDBC连接MySQL数据库时,使用Class.forName("com.mysql.jdbc.Driver")就是为了向DriverManager注册自己;当然使用Class.forName("com.mysql.jdbc.Driver").newInstance()当然也没错,只是没有必要,因为后者还会生成Driver类的实例,而这个是我们没有用的,没有必要创建它。如果在Driver类中那个static块里面的部分写在了构造方法中,那么就必须使用Class.forName("com.mysql.jdbc.Driver").newInstance()来向DriverManager注册了。
分享到:
相关推荐
对SPI,理论联系实际的理解
Class.forName("com.pivotal.jdbc.GreenplumDriver"); Connection db = DriverManager .getConnection( "jdbc:pivotal:greenplum://xxx:5432;DatabaseName=core_db", "gpadmin", "gpadmin"); Statement st = db....
1. **Class.forName()**:在Java代码中,需要加载JDBC驱动并实例化,通常使用`Class.forName()`方法指定驱动类名,例如`com.microsoft.sqlserver.jdbc.SQLServerDriver`。 2. **Connection对象**:这是与数据库建立...
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //Driver是静态代码块,类加载了就执行,用registerDriver会二次注册 //DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.**...
这通常通过`Class.forName()`方法完成,例如对于MySQL,会写成`Class.forName("com.mysql.jdbc.Driver")`。 2. **获取数据库连接**:使用`DriverManager.getConnection()`方法,传入数据库URL、用户名和密码,即可...
1. **加载驱动**:通过`Class.forName()`加载JDBC驱动。 2. **创建连接**:使用`DriverManager.getConnection()`方法建立与数据库的连接。 3. **创建命令发送器**:根据需要创建`Statement`或`PreparedStatement`...
在 Java 代码中,使用 `Class.forName("org.postgresql.Driver").newInstance();` 语句加载驱动程序,然后使用 `DriverManager.getConnection(url, username, password);` 语句连接到 PostgreSQL 数据库。 2. 获取...
首先,你可以创建一个"xxx.properties"属性文件,并存在与环境路径中(xxx代表你的属性文件名)然后 在URL中直接指定这个属性文件名:"jdbc:proxy:xxx" 其次,你可以在URL最后跟上类似"?key=value&key=value……...
java访问sqlite public class TestSqlite3 { ... Class.forName(Class_Name);// 加载驱动,连接sqlite的jdbc Connection connection=DriverManager.getConnection(DB_URL);//连接数据库zhou.db,不存在则创建
- 使用 `Class.forName()` 方法显式加载驱动程序。 - 创建驱动实例并通过 `DriverManager.registerDriver()` 注册。 - 在编译时通过虚拟机参数加载驱动程序。 示例代码: ```java // 方式一 Class.forName(...
JDBC 4.0以后,驱动可以通过服务发现自动加载,无需显式调用`Class.forName()`。 8. **JDBC基础教程之ResultSet对象** - `ResultSet`的行为类似于一个指针,指向当前行。`next()`方法用于移动指针到下一行,`...
`registerDriver(Driver driver)`方法用于向DriverManager注册驱动,但通常不推荐直接使用,而是通过`Class.forName()`动态加载。`getConnection(String url, String user, String pwd)`方法则用于根据指定的URL、...
- 示例:对于Oracle数据库,使用`Class.forName("oracle.jdbc.driver.OracleDriver")`。 2. **创建数据库连接**: - 调用`DriverManager.getConnection(String url, String username, String password)`获取连接...
- 方式一:`Class.forName("oracle.jdbc.driver.OracleDriver");` - 方式二:`Driver drv = new oracle.jdbc.driver.OracleDriver(); DriverManager.registerDriver(drv);` - 方式三:在编译时通过虚拟机参数加载...
1. 加载数据库驱动并建立连接:使用`Class.forName()`加载驱动,然后通过`DriverManager.getConnection()`建立与数据库的连接。 2. 创建CallableStatement对象:与PreparedStatement用于执行SQL语句类似,...
在实例化驱动时,通常有三种方法:通过DriverManager.registerDriver直接注册、设置系统属性`jdbc.drivers`或者使用`Class.forName`来加载驱动类。其中,`Class.forName`方法虽然不直接创建Driver实例,但将类加载到...
这通常通过`Class.forName()`方法完成,例如对于MySQL:“Class.forName("com.mysql.jdbc.Driver")”。 2. **建立连接**:使用`DriverManager.getConnection()`方法建立到数据库的连接。你需要提供数据库URL、...
1. **加载驱动**:使用`Class.forName()`方法加载对应的数据库驱动,例如`Class.forName("com.mysql.jdbc.Driver")`对于MySQL。 2. **建立连接**:通过`DriverManager.getConnection()`方法创建数据库连接,通常...