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

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一区二区| 日本成人午夜在线观看| 欧美日韩国产av一区| 欧美曰韩国内精品中文| 日本一区二区三区精彩视频| 亚洲国产午夜福利在线69| 欧美一区二区欧美精品 | 亚洲av污精品一区二区三区| 岛国少妇av之中文字幕| 国产亚洲一区二区三区日韩| 人妻中字幕出轨中文字幕| 日韩久久精品国产亚洲av成人| 一区二区三区免费视频少妇| 看看永久成人免费视频| 亚洲精品一区二区三区pp| 国产精品一级片一区二区| 亚洲欧美一区日韩尤物| 99精品久久久中文字幕日本| 亚洲欧洲日产国码一区| 亚洲欧洲另类美女久久精品| 四虎在线经典视频播放| 国产黄片一区二区不卡| 日韩精品亚洲一区二区三区免费| 国产成人亚洲精品另类动态| 91伊人日本在线视频| 亚洲男人的天堂社区av| 国家成人午夜在线观看| 亚洲毛片一区二区在线| 乱码日本欧美一区二区| 亚洲成人日韩国产欧美| 日日骚国产欧美一区二区| 亚洲一区二区三区在线观看呢 | av天堂五月在线观看| 国产精品一级二区三区| 欧美中日韩一区二区三区| 91成人伦理在线观看| 少妇38p高潮在线| 日本一区二区久久人妻高清| 亚洲av少妇高潮流白浆在线|