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

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)化
国产三级精品大乳人妇| 避暑地堕落人妻中文字幕| 九九热精品在线观看视频| 高清偷自拍亚洲精品三区| 最新91精品国产自产在线| 97国产精品成人免费视频| 欧美日韩在线一区二区精品| 日本精品在线不卡视频| 懂色av免费在线播放| 天天色天天色天天色综合网| 黄片免费视频大全在线观看| 美女性生活免费视频网站| 亚洲精品一区二区99| 精品国产成人一区二区| 岛国av在线免费观看| 色播婷婷午夜激情福利| 亚洲精品国产精品乱码不卞| 91一区二区亚洲嫩草| 97精品久久九九中文字幕| 欧美曰韩国内精品中文| 欧美亚洲少妇人妻系列| 亚洲综合av伊人久久| 亚洲精品国产精品粉嫩| 精品人妻一区二区三区mp4| 亚洲国产熟对白剧情一区二区| 亚洲国产视频中文字幕| 欧美午夜精品一二三区| 97视频在线观看观看| 亚洲欧美制服另类国产| 日韩成人在线高清视频| 亚洲成av人在线观看福利| 久久99精品综合国产女同| 黄色国产一区二区三区| 国产综合一区在线观看97| 尤物视频在线观看官网| 亚洲国产精品成人久久66| 色噜噜狠狠狠久久综合一区| 女人的天堂av免费在线观看| 欧美精品日韩中文字幕在| 精品一区二区三区推荐| 亚洲欧美精品成人一区|