中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Class.forName方法如何在java中使用

發布時間:2020-11-25 15:54:08 來源:億速云 閱讀:186 作者:Leah 欄目:編程語言

Class.forName方法如何在java中使用?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

前言

在做JAVA EE開發的過程中,更多的是使用框架來提高開發效率.越來越發現,之前很基礎的一些東西,都忘記的差不多了.從今天開始慢慢的復習一下基礎.今天在看JDBC的時候,就有一個有趣的地方,之前學的時候,也沒在意.這個Class.forName究竟是什么鬼.

連接數據庫幾大步.看以下代碼

import com.mysql.jdbc.Driver;
 
import java.sql.*;
 
/**
 * @author honway.liu
 * @date 2016/12/8 下午11:07
 * @email gm100861@gmail.com
 * @blog http://linuxsogood.org
 */
public class JdbcDemo {
 
 public static void main(String[] args) throws SQLException, ClassNotFoundException {
  String url = "jdbc:mysql://127.0.0.1:3306/mydb";
  String username = "root";
  String password = "redhat";
  Class.forName("com.mysql.jdbc.Driver");
  Connection connection = DriverManager.getConnection(url, username, password);
  String sql = "SELECT * FROM msg";
  PreparedStatement prepareStatement = connection.prepareStatement(sql);
  ResultSet resultSet = prepareStatement.executeQuery();
  resultSet.next();
  String address = resultSet.getString("address");
  System.out.println(address);
 }
}

其中第一步,搞的我有點想不通.為啥Class.forName傳入了一段字符串之后,就知道我連接的數據庫是mysql? 有點不科學啊.Class.forName到底做了啥.下面就開始到源碼中,一探究竟.

 @CallerSensitive
 public static Class<&#63;> forName(String className)
    throws ClassNotFoundException {
  Class<&#63;> caller = Reflection.getCallerClass();
  return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
 }

發現它調用了forName0方法,繼續跟蹤再看看

 private static native Class<&#63;> forName0(String name, boolean initialize,
           ClassLoader loader,
           Class<&#63;> caller)
  throws ClassNotFoundException;

native方法,源碼也只能到此結束了.看下官方文檔,怎么說吧.

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName(java.lang.String)

發現官方文檔,還是描述的很清楚的.

Returns the Class object associated with the class or interface with the given string name,
 using the given class loader. 
Given the fully qualified name for a class or interface (in the same format returned by getName)
 this method attempts to locate, load, and link the class or interface. 
The specified class loader is used to load the class or interface. 
If the parameter loader is null, the class is loaded through the bootstrap class loader.
 The class is initialized only if the initialize parameter is true and if it has not been 
initialized earlier.

嗯,描述的還算是很清楚.返回一個給定類或者接口的一個Class對象,如果沒有給定classloader,那么會使用根類加載器.如果initalize這個參數傳了true,那么給定的類如果之前沒有被初始化過,那么會被初始化.我們在JDBC第一步的時候,傳入的參數是com.mysql.jdbc.Driver. 也就是說這個類會被初始化.我們看一下這個類里面的內容.

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 {
  // Required for Class.forName().newInstance()
 }
}

我們發現這個類也是超級簡單的.一個構造函數和一個靜態代碼塊.我們知道,類在初始化的時候,靜態代碼塊的內容會被執行的.也就是說我們Class.forName和直接寫DriverManager.registerDriver(new Driver)兩者功能是等同的.我們換成這種寫法.再試試看.

public class JdbcDemo {
 
 public static void main(String[] args) throws SQLException, ClassNotFoundException {
  String url = "jdbc:mysql://127.0.0.1:3306/mydb";
  String username = "root";
  String password = "redhat";
  //Class.forName("com.mysql.jdbc.Driver");
  DriverManager.registerDriver(new Driver());
  Connection connection = DriverManager.getConnection(url, username, password);
  String sql = "SELECT * FROM msg";
  PreparedStatement prepareStatement = connection.prepareStatement(sql);
  ResultSet resultSet = prepareStatement.executeQuery();
  resultSet.next();
  String address = resultSet.getString("address");
  System.out.println(address);
 }
}

發現代碼,還是正常的執行了.

總結一下:

Class.forName方法的作用,就是初始化給定的類.而我們給定的MySQL的Driver類中,它在靜態代碼塊中通過JDBC的DriverManager注冊了一下驅動.我們也可以直接使用JDBC的驅動管理器注冊mysql驅動.從而代替使用Class.forName.

關于Class.forName方法如何在java中使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长岛县| 台湾省| 安乡县| 深泽县| 定日县| 内丘县| 连州市| 洛浦县| 子洲县| 苗栗市| 余庆县| 昭平县| 梁山县| 赣榆县| 章丘市| 额尔古纳市| 武隆县| 色达县| 广丰县| 丰镇市| 措勤县| 合山市| 双江| 桓台县| 镇巴县| 石楼县| 遵义市| 巩留县| 库伦旗| 调兵山市| 老河口市| 砚山县| 通江县| 息烽县| 措美县| 丁青县| 蓬溪县| 洛宁县| 克什克腾旗| 上饶市| 灵武市|