欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

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

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

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、新鄉(xiāng)ssl等。為數(shù)千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的新鄉(xiāng)網(wǎng)站制作公司

前言

在做JAVA EE開(kāi)發(fā)的過(guò)程中,更多的是使用框架來(lái)提高開(kāi)發(fā)效率.越來(lái)越發(fā)現(xiàn),之前很基礎(chǔ)的一些東西,都忘記的差不多了.從今天開(kāi)始慢慢的復(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到底做了啥.下面就開(kāi)始到源碼中,一探究竟.

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

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

 private static native Class<&#63;> forName0(String name, boolean initialize,
           ClassLoader loader,
           Class<&#63;> 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è)給定類(lèi)或者接口的一個(gè)Class對(duì)象,如果沒(méi)有給定classloader,那么會(huì)使用根類(lèi)加載器.如果initalize這個(gè)參數(shù)傳了true,那么給定的類(lèi)如果之前沒(méi)有被初始化過(guò),那么會(huì)被初始化.我們?cè)贘DBC第一步的時(shí)候,傳入的參數(shù)是com.mysql.jdbc.Driver. 也就是說(shuō)這個(gè)類(lèi)會(huì)被初始化.我們看一下這個(gè)類(lèi)里面的內(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è)類(lèi)也是超級(jí)簡(jiǎn)單的.一個(gè)構(gòu)造函數(shù)和一個(gè)靜態(tài)代碼塊.我們知道,類(lèi)在初始化的時(shí)候,靜態(tài)代碼塊的內(nèi)容會(huì)被執(zhí)行的.也就是說(shuō)我們Class.forName和直接寫(xiě)DriverManager.registerDriver(new Driver)兩者功能是等同的.我們換成這種寫(xiě)法.再試試看.

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

關(guān)于Class.forName方法如何在java中使用問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

新聞名稱(chēng):Class.forName方法如何在java中使用
文章起源:http://aaarwkj.com/article2/iggooc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司App設(shè)計(jì)、服務(wù)器托管、網(wǎng)頁(yè)設(shè)計(jì)公司、軟件開(kāi)發(fā)自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
亚洲青涩精品一区二区三区| 日韩欧美亚洲国产资源| 欧美日韩亚洲国产精品视频| 成人欧美一区二区三区av| 国产成人国产精品国产三级| 日韩精品一区二区三区电影在线播放| 五十路八十路息与子交尾| 欧美精品激情在线不卡| 亚洲国产欧美日韩激情在线| 日本加勒比高清在线播放| 夫妻性生活视频一级片| 日本东京一区二区三区| 精品一二三区在线天堂| 成年人性生活一级视品| 中文字幕日韩有码在线| 国产丝袜在线精品丝袜不卡| 亚洲欧美日韩老汉影院| 日本中文有码视频在线观看| 永久免费观看黄色录像| 亚洲欧美日韩不卡视频| 青青草最新网址在线观看视频| 黄色日韩欧美在线观看| 国产成人亚洲精品在线看| 亚洲午夜黄色生活片观看| 蜜桃一区二区三区免费| 国产69精品久久一级| 久久国产精品亚洲看片| 日本免费高清一区二区| 亚洲成人久久久av一区| 日韩欧美 高清一区| 中文字幕一区中出爽亚洲| 国产一级精品自拍视频| 精品少妇人妻久久av免费| 在线一区二区三区成人观看| 欧美日韩视频在线第一页| 内射性感黑丝少妇av| 爱高潮www亚洲精品| 97久久成人国产精品免费| 色人阁在线精品免费视频 | 91青青草原免费观看| 男男啪啪猛进猛出无遮挡|