最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中Class.forName方法的作用詳解

 更新時(shí)間:2017年06月29日 11:06:41   作者:honway  
Class.forName(xxx.xx.xx) 返回的是一個(gè)類,但Class.forName方法的作用到底是什么終?下面這篇文章就來(lái)給大家詳細(xì)介紹了關(guān)于java中Class.forName方法的作用,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。

前言

在做JAVA EE開發(fā)的過(guò)程中,更多的是使用框架來(lái)提高開發(fā)效率.越來(lái)越發(fā)現(xiàn),之前很基礎(chǔ)的一些東西,都忘記的差不多了.從今天開始慢慢的復(fù)習(xí)一下基礎(chǔ).今天在看JDBC的時(shí)候,就有一個(gè)有趣的地方,之前學(xué)的時(shí)候,也沒(méi)在意.這個(gè)Class.forName究竟是什么鬼.

連接數(shù)據(jù)庫(kù)幾大步.看以下代碼

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);
 }
}

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

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

發(fā)現(xiàn)它調(diào)用了forName0方法,繼續(xù)跟蹤再看看

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

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

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

發(fā)現(xiàn)官方文檔,還是描述的很清楚的.

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.

嗯,描述的還算是很清楚.返回一個(gè)給定類或者接口的一個(gè)Class對(duì)象,如果沒(méi)有給定classloader,那么會(huì)使用根類加載器.如果initalize這個(gè)參數(shù)傳了true,那么給定的類如果之前沒(méi)有被初始化過(guò),那么會(huì)被初始化.我們?cè)贘DBC第一步的時(shí)候,傳入的參數(shù)是com.mysql.jdbc.Driver. 也就是說(shuō)這個(gè)類會(huì)被初始化.我們看一下這個(gè)類里面的內(nèi)容.

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()
 }
}

我們發(fā)現(xiàn)這個(gè)類也是超級(jí)簡(jiǎn)單的.一個(gè)構(gòu)造函數(shù)和一個(gè)靜態(tài)代碼塊.我們知道,類在初始化的時(shí)候,靜態(tài)代碼塊的內(nèi)容會(huì)被執(zhí)行的.也就是說(shuō)我們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);
 }
}

發(fā)現(xiàn)代碼,還是正常的執(zhí)行了.

總結(jié)一下:

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

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • IDEA調(diào)試功能使用總結(jié)(step?over/step?into/force?step?into/step?out)

    IDEA調(diào)試功能使用總結(jié)(step?over/step?into/force?step?into/step?o

    本文主要介紹了IDEA調(diào)試功能使用總結(jié)(step?over/step?into/force?step?into/step?out),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Jmeter后置處理器實(shí)現(xiàn)過(guò)程及方法應(yīng)用

    Jmeter后置處理器實(shí)現(xiàn)過(guò)程及方法應(yīng)用

    這篇文章主要介紹了Jmeter后置處理器實(shí)現(xiàn)過(guò)程及方法應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java設(shè)計(jì)模式之訪問(wèn)模式(Visitor者模式)介紹

    Java設(shè)計(jì)模式之訪問(wèn)模式(Visitor者模式)介紹

    這篇文章主要介紹了Java設(shè)計(jì)模式之訪問(wèn)模式(Visitor者模式)介紹,本文講解了為何使用Visitor模式、如何使用Visitor模式、使用Visitor模式的前提等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • JavaCV簡(jiǎn)介與環(huán)境搭建詳細(xì)步驟

    JavaCV簡(jiǎn)介與環(huán)境搭建詳細(xì)步驟

    JavaCV是一個(gè)開源的Java接口,它為幾個(gè)著名的計(jì)算機(jī)視覺(jué)庫(kù)(如OpenCV、FFmpeg)提供了Java封裝,這篇文章主要給大家介紹了關(guān)于JavaCV簡(jiǎn)介與環(huán)境搭建的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • Java多線程實(shí)戰(zhàn)之單例模式與多線程的實(shí)例詳解

    Java多線程實(shí)戰(zhàn)之單例模式與多線程的實(shí)例詳解

    今天小編就為大家分享一篇關(guān)于Java多線程實(shí)戰(zhàn)之單例模式與多線程的實(shí)例詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 圖解Java經(jīng)典算法插入排序的原理與實(shí)現(xiàn)

    圖解Java經(jīng)典算法插入排序的原理與實(shí)現(xiàn)

    插入排序的算法描述是一種簡(jiǎn)單直觀的排序算法。其原理是通過(guò)構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。本文將用Java語(yǔ)言實(shí)現(xiàn)插入排序算法并進(jìn)行可視化,感興趣的可以了解一下
    2022-09-09
  • java 中newInstance()方法和new關(guān)鍵字的區(qū)別

    java 中newInstance()方法和new關(guān)鍵字的區(qū)別

    這篇文章主要介紹了java 中newInstance()方法和new關(guān)鍵字的區(qū)別的相關(guān)資料,希望通過(guò)本文大家能掌握他們之家的區(qū)別與用法,需要的朋友可以參考下
    2017-09-09
  • SpringBoot無(wú)法使用jkd8問(wèn)題的解決方法

    SpringBoot無(wú)法使用jkd8問(wèn)題的解決方法

    這篇文章主要介紹了SpringBoot無(wú)法使用jkd8問(wèn)題的解決方法,文中通過(guò)圖文結(jié)合的形式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • SpringBoot+Thymeleaf靜態(tài)資源的映射規(guī)則說(shuō)明

    SpringBoot+Thymeleaf靜態(tài)資源的映射規(guī)則說(shuō)明

    這篇文章主要介紹了SpringBoot+Thymeleaf靜態(tài)資源的映射規(guī)則說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring mvc工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Spring mvc工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了Spring mvc工作原理的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評(píng)論

行唐县| 湛江市| 汉川市| 镶黄旗| 上虞市| 大方县| 上饶县| 重庆市| 隆回县| 麟游县| 汉沽区| 青龙| 龙游县| 彰化市| 平遥县| 昂仁县| 喀喇沁旗| 乌审旗| 延吉市| 城步| 英吉沙县| 安新县| 会理县| 郸城县| 奇台县| 清新县| 双峰县| 镇江市| 广元市| 陇南市| 芜湖县| 武鸣县| 泸溪县| 霞浦县| 温泉县| 荔浦县| 梁山县| 太谷县| 崇左市| 珲春市| 东阳市|