欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中Class.forName的作用淺談

 更新時(shí)間:2013年11月01日 15:10:01   作者:  
這篇文章介紹了java中Class.forName的作用,有需要的朋友可以參考一下

Class.forName(xxx.xx.xx) 返回的是一個(gè)類

一.首先你要明白在java里面任何class都要裝載在虛擬機(jī)上才能運(yùn)行。

1. forName這句話就是裝載類用的(new是根據(jù)加載到內(nèi)存中的類創(chuàng)建一個(gè)實(shí)例,要分清楚)。
  至于什么時(shí)候用,可以考慮一下這個(gè)問(wèn)題,給你一個(gè)字符串變量,它代表一個(gè)類的包名和類名,你怎么實(shí)例化它?

    A a = (A)Class.forName("pacage.A").newInstance();        這和           A a = new A();        是一樣的效果。

2.jvm在裝載類時(shí)會(huì)執(zhí)行類的靜態(tài)代碼段,要記住靜態(tài)代碼是和class綁定的,class裝載成功就表示執(zhí)行了你的靜態(tài)代碼了,而且以后不會(huì)再執(zhí)行這段靜態(tài)代碼了。

Class.forName(xxx.xx.xx)的作用是要求JVM查找并加載指定的類,也就是說(shuō)JVM會(huì)執(zhí)行該類的靜態(tài)代碼段。

3.動(dòng)態(tài)加載和創(chuàng)建Class 對(duì)象,比如想根據(jù)用戶輸入的字符串來(lái)創(chuàng)建對(duì)象

復(fù)制代碼 代碼如下:

String str = 用戶輸入的字符串  

Class t = Class.forName(str);  

t.newInstance(); 


二.在初始化一個(gè)類,生成一個(gè)實(shí)例的時(shí)候,newInstance()方法和new關(guān)鍵字除了一個(gè)是方法,一個(gè)是關(guān)鍵字外,最主要有什么區(qū)別?

1.它們的區(qū)別在于創(chuàng)建對(duì)象的方式不一樣,前者是使用類加載機(jī)制,后者是創(chuàng)建一個(gè)新類。

2.那么為什么會(huì)有兩種創(chuàng)建對(duì)象方式?

 這主要考慮到軟件的可伸縮、可擴(kuò)展和可重用等軟件設(shè)計(jì)思想。 
Java中工廠模式經(jīng)常使用newInstance()方法來(lái)創(chuàng)建對(duì)象,因此從為什么要使用工廠模式上可以找到具體答案。 例如:

復(fù)制代碼 代碼如下:

    class c = Class.forName(“Example”);  

    factory = (ExampleInterface)c.newInstance();  


其中ExampleInterface是Example的接口,可以寫(xiě)成如下形式:
復(fù)制代碼 代碼如下:

   String className = "Example";  

   class c = Class.forName(className);  

   factory = (ExampleInterface)c.newInstance();  


進(jìn)一步可以寫(xiě)成如下形式:
復(fù)制代碼 代碼如下:

   String className = readfromXMlConfig;//從xml 配置文件中獲得字符串

  class c = Class.forName(className);  

  factory = (ExampleInterface)c.newInstance();  


 上面代碼已經(jīng)不存在Example的類名稱,它的優(yōu)點(diǎn)是,無(wú)論Example類怎么變化,上述代碼不變,甚至可以更換Example的兄弟類Example2 , Example3 , Example4……,只要他們繼承ExampleInterface就可以。 
3.從JVM的角度看,我們使用關(guān)鍵字new創(chuàng)建一個(gè)類的時(shí)候,這個(gè)類可以沒(méi)有被加載。  但是使用newInstance()方法的時(shí)候,

  就必須保證:

       1、這個(gè)類已經(jīng)加載;

       2、這個(gè)類已經(jīng)連接了。

 而完成上面兩個(gè)步驟的正是Class的靜態(tài)方法forName()所完成的,這個(gè)靜態(tài)方法調(diào)用了啟動(dòng)類加載器,即加載 java API的那個(gè)加載器。 
 現(xiàn)在可以看出,newInstance()實(shí)際上是把new這個(gè)方式分解為兩步,即首先調(diào)用Class加載方法加載某個(gè)類,然后實(shí)例化。 這樣分步的好處是顯而易見(jiàn)的。我們可以在調(diào)用class的靜態(tài)加載方法forName時(shí)獲得更好

  的靈活性,提供給了一種降耦的手段。 
三.最后用最簡(jiǎn)單的描述來(lái)區(qū)分new關(guān)鍵字和newInstance()方法的區(qū)別: 
  1. newInstance: 弱類型。低效率。只能調(diào)用無(wú)參構(gòu)造。 
  2. new: 強(qiáng)類型。相對(duì)高效。能調(diào)用任何public構(gòu)造。

     有數(shù)據(jù)庫(kù)開(kāi)發(fā)經(jīng)驗(yàn)朋友會(huì)發(fā)現(xiàn),為什么在我們加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)包的時(shí)候有的卻沒(méi)有調(diào)用newInstance( )方法呢?

    即有的jdbc連接數(shù)據(jù)庫(kù)的寫(xiě)法里是Class.forName(xxx.xx.xx);而有一些:Class.forName(xxx.xx.xx).newInstance(),為什么會(huì)有這兩種寫(xiě)法呢?
    剛才提到,Class.forName("");的作用是要求JVM查找并加載指定的類,如果在類中有靜態(tài)初始化器的話,JVM必然會(huì)執(zhí)行該類的靜態(tài)代碼段。

    而在JDBC規(guī)范中明確要求這個(gè)Driver類必須向DriverManager注冊(cè)自己,即任何一個(gè)JDBC Driver的Driver類的代碼都必須類似如下:
   

復(fù)制代碼 代碼如下:

    public class MyJDBCDriver implements Driver {
    static {
       DriverManager.registerDriver(new MyJDBCDriver());
   }
   }
  

既然在靜態(tài)初始化器的中已經(jīng)進(jìn)行了注冊(cè),所以我們?cè)谑褂肑DBC時(shí)只需要Class.forName(XXX.XXX);就可以了。

相關(guān)文章

  • 老生常談Java虛擬機(jī)垃圾回收機(jī)制(必看篇)

    老生常談Java虛擬機(jī)垃圾回收機(jī)制(必看篇)

    下面小編就為大家?guī)?lái)一篇老生常談Java虛擬機(jī)垃圾回收機(jī)制(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Java布爾值Boolean和boolean之間轉(zhuǎn)換實(shí)例用法

    Java布爾值Boolean和boolean之間轉(zhuǎn)換實(shí)例用法

    在本篇文章里小編給大家整理的是一篇關(guān)于Java布爾值Boolean和boolean之間轉(zhuǎn)換實(shí)例用法內(nèi)容,有需要的朋友們跟著學(xué)習(xí)參考下。
    2021-06-06
  • spring boot參數(shù)驗(yàn)證注解@NotNull、@NotBlank和@NotEmpty區(qū)別解析

    spring boot參數(shù)驗(yàn)證注解@NotNull、@NotBlank和@NotEmpty區(qū)別解析

    使用spring boot參數(shù)驗(yàn)證是常常會(huì)使用@NotNull、@NotBlank和@NotEmpty三個(gè)判斷是否不為空的注解,中文都有不能為空的意思,大部分使用者都傻傻分清它們之間到底有什么區(qū)別,今天就讓咱們來(lái)一起探索它們之間的不同吧,感興趣的朋友一起看看吧
    2024-05-05
  • Spring中的spring-retry重試機(jī)制解析

    Spring中的spring-retry重試機(jī)制解析

    這篇文章主要介紹了Spring中的spring-retry重試機(jī)制解析,spring-retry可以通過(guò)注解,在不入侵原有業(yè)務(wù)邏輯代碼的方式下,優(yōu)雅的實(shí)現(xiàn)重處理功能,在spring-retry中,所有配置都是基于簡(jiǎn)單注釋的,需要的朋友可以參考下
    2024-01-01
  • java實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲(2)

    java實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲(2)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲的第二部分,添加游戲結(jié)束條件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 排查Java應(yīng)用內(nèi)存泄漏問(wèn)題的步驟

    排查Java應(yīng)用內(nèi)存泄漏問(wèn)題的步驟

    這篇文章主要介紹了排查Java應(yīng)用內(nèi)存泄漏問(wèn)題的步驟,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-11-11
  • SpringBoot實(shí)現(xiàn)接口的各種參數(shù)校驗(yàn)的示例

    SpringBoot實(shí)現(xiàn)接口的各種參數(shù)校驗(yàn)的示例

    本文主要介紹了SpringBoot實(shí)現(xiàn)接口的各種參數(shù)校驗(yàn)的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟

    Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 自己動(dòng)手用Springboot實(shí)現(xiàn)仿百度網(wǎng)盤(pán)的實(shí)踐

    自己動(dòng)手用Springboot實(shí)現(xiàn)仿百度網(wǎng)盤(pán)的實(shí)踐

    本項(xiàng)目基于Springboot開(kāi)發(fā)實(shí)現(xiàn),前端采用BootStrap開(kāi)發(fā)實(shí)現(xiàn),模仿百度網(wǎng)盤(pán)實(shí)現(xiàn)相關(guān)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 關(guān)于request.getRequestDispatcher().forward()的妙用及DispatcherType對(duì)Filter配置的影響

    關(guān)于request.getRequestDispatcher().forward()的妙用及DispatcherType

    這篇文章主要介紹了關(guān)于request.getRequestDispatcher().forward()的妙用及DispatcherType對(duì)Filter配置的影響,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論