亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“Class.forName()”和“Class.forName().newInstance()”

“Class.forName()”和“Class.forName().newInstance()”

慕碼人8056858 2019-08-03 07:03:14
“Class.forName()”和“Class.forName().newInstance()”之間有什么區別?.之間的區別是什么?Class.forName()和Class.forName().newInstance()?我不明白其中的重大區別(我讀過一些關于它們的文章)。你能幫幫我嗎?
查看完整描述

3 回答

?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

forName()為您提供了類對象,這對于反射非常有用。這個對象所擁有的方法是由Java定義的,而不是由編寫類的程序員定義的。每個班級都是一樣的。調用newInstance()為您提供了該類的實例(即調用Class.forName("ExampleClass").newInstance()它相當于調用new ExampleClass()),您可以在該方法上調用類定義的方法,訪問可見字段等。



查看完整回答
反對 回復 2019-08-05
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

在JDBC世界中,正常實踐(根據JDBCAPI)是使用Class#forName()加載JDBC驅動程序。jdbc驅動程序應該即在DriverManager在靜態塊內:

package com.dbvendor.jdbc;import java.sql.Driver;import java.sql.DriverManager;public class MyDriver implements Driver {

    static {
        DriverManager.registerDriver(new MyDriver());
    }

    public MyDriver() {
        //
    }}

調用Class#forName()將執行所有靜態初始化器..這條路DriverManager期間,可以通過連接URL在注冊的驅動程序中找到關聯的驅動程序。getConnection()大致如下:

public static Connection getConnection(String url) throws SQLException {
    for (Driver driver : registeredDrivers) {
        if (driver.acceptsURL(url)) {
            return driver.connect(url);
        }
    }
    throw new SQLException("No suitable driver");}

但也有嬰兒車JDBC驅動程序,從org.gjt.mm.mysql.Driver作為眾所周知的示例,它錯誤地在構造器而不是靜態塊:

package com.dbvendor.jdbc;import java.sql.Driver;import java.sql.DriverManager;public class BadDriver implements Driver {

    public BadDriver() {
        DriverManager.registerDriver(this);
    }}

讓它動態工作的唯一方法是調用newInstance()之后!否則,您將面臨無法解釋的“SQLException:沒有合適的驅動程序”。再一次,這是蟲蟲在JDBC驅動程序中,而不是在您自己的代碼中?,F在,沒有一個JDBC驅動程序應該包含這個bug。以便您可以(并且應該)離開newInstance()走開。




查看完整回答
反對 回復 2019-08-05
  • 3 回答
  • 0 關注
  • 330 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號