Java“ Class.forName()”和“ Class.forName()newInstance()”之間有什么區(qū)別?
也許一個示例演示如何使用兩種方法將有助于你更好地理解事物。因此,請考慮以下類:
package test;public class Demo { public Demo() {System.out.println('Hi!'); } public static void main(String[] args) throws Exception {Class clazz = Class.forName('test.Demo');Demo demo = (Demo) clazz.newInstance(); }}
如其javadoc中所述,調(diào)用將返回與具有給定字符串名稱的類或接口關(guān)聯(lián)的對象,即它返回受type變量影響的對象。Class.forName(String) Classtest.Demo.classclazzClass
然后,調(diào)用創(chuàng)建該 對象表示的類的新實(shí)例。就像通過帶有空參數(shù)列表的表達(dá)式實(shí)例化該類。換句話說,這實(shí)際上等于a 并返回的新實(shí)例。clazz.newInstance() Classnewnew Demo()Demo
Demo因此,運(yùn)行此類將輸出以下輸出:
Hi!
與傳統(tǒng)的最大區(qū)別new在于,它newInstance可以實(shí)例化一個直到運(yùn)行時才知道的類,從而使代碼更具動態(tài)性。
一個典型的示例是JDBC API,它在運(yùn)行時加載執(zhí)行工作所需的確切驅(qū)動程序。EJB容器,Servlet容器是另一個很好的例子:它們使用動態(tài)運(yùn)行時加載來加載和創(chuàng)建在運(yùn)行時之前一無所知的組件。
實(shí)際上,如果你想走得更遠(yuǎn),請看一下Ted Neward的論文《理解Class.forName()》,我在上一段中對此進(jìn)行了解釋。
編輯(從發(fā)表為評論的OP中回答問題):JDBC驅(qū)動程序的情況有點(diǎn)特殊。如《 JDBC API入門》中DriverManager章節(jié)所述:
(…)Driver加載了一個類,因此通過以下DriverManager兩種方式之一自動向進(jìn)行注冊:
通過調(diào)用方法Class.forName。這將顯式加載驅(qū)動程序類。由于它不依賴任何外部設(shè)置,因此推薦使用這種加載驅(qū)動程序的方式來使用該DriverManager 框架。以下代碼加載該類acme.db.Driver:Class.forName('acme.db.Driver');
如果acme.db.Driver編寫了這樣的代碼以便加載它會導(dǎo)致創(chuàng)建一個實(shí)例,并且還 DriverManager.registerDriver以該實(shí)例作為參數(shù)進(jìn)行調(diào)用(應(yīng)該這樣做),則它在 DriverManager驅(qū)動程序列表中,可用于創(chuàng)建連接。
(...)在這兩種情況下,新加載的Driver類都有責(zé)任通過調(diào)用進(jìn)行注冊DriverManager.registerDriver。如前所述,這應(yīng)該在加載類時自動完成。
為了在初始化期間注冊自己,JDBC驅(qū)動程序通常使用一個靜態(tài)初始化塊,如下所示:
package acme.db;public class Driver { static {java.sql.DriverManager.registerDriver(new Driver()); } ...}
調(diào)用Class.forName(“acme.db.Driver”)會導(dǎo)致acme.db.Driver類的初始化,并因此導(dǎo)致靜態(tài)初始化塊的執(zhí)行。并且 Class.forName(“acme.db.Driver”)確實(shí)會“創(chuàng)建”一個實(shí)例,但這只是實(shí)現(xiàn)(良好)JDBC驅(qū)動程序的結(jié)果。
解決方法Class.forName()和之間有什么區(qū)別Class.forName().newInstance()?
我不了解其中的重大區(qū)別(我已經(jīng)閱讀了一些有關(guān)它們的信息!)。請你幫助我好嗎?
相關(guān)文章:
1. mysql 查詢身份證號字段值有效的數(shù)據(jù)2. 視頻文件不能播放,怎么辦?3. node.js - nodejs開發(fā)中常用的連接mysql的庫4. python bottle跑起來以后,定時執(zhí)行的任務(wù)為什么每次都重復(fù)(多)執(zhí)行一次?5. mysql - 把一個表中的數(shù)據(jù)count更新到另一個表里?6. 請教使用PDO連接MSSQL數(shù)據(jù)庫插入是亂碼問題?7. mysql - 分庫分表、分區(qū)、讀寫分離 這些都是用在什么場景下 ,會帶來哪些效率或者其他方面的好處8. python - 爬蟲模擬登錄后,爬取csdn后臺文章列表遇到的問題9. visual-studio - Python OpenCV: 奇怪的自動補(bǔ)全問題10. Python爬蟲如何爬取span和span中間的內(nèi)容并分別存入字典里?
