乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      理解class.forName()

       博雅書屋lhs 2014-09-14

      使用jdbc方式連接數(shù)據(jù)庫(kù)時(shí)會(huì)使用一句代碼Class.forName(String className).這句話是什么意思呢?首先說一點(diǎn)Class.forName(String className)這個(gè)方法的作用是裝載className這個(gè)字符串指定的類。


      官方文檔


      返回與帶有給定字符串名的類或接口相關(guān)聯(lián)的 Class 對(duì)象。調(diào)用此方法等效于:

        Class.forName(className, true, currentLoader)

       其中 currentLoader 表示此類的定義類加載器。

      例如,以下代碼片段返回 java.lang.Thread 類的運(yùn)行時(shí) Class 描述符。


         Class t = Class.forName("java.lang.Thread")

       調(diào)用 forName("X") 將導(dǎo)致名為 的類被初始化。


      參數(shù):

      className - 所需類的完全限定名。

      返回:

      具有指定名的類的 Class 對(duì)象。


      通俗的說就是:獲得字符串參數(shù)中指定的類,并初始化該類


      類裝載


      類裝載就是把一個(gè)類或是一個(gè)接口的字節(jié)碼文件,通過解析該字節(jié)碼來構(gòu)建代表這個(gè)類或是這個(gè)接口的實(shí)例的過程。 這個(gè)字節(jié)碼文件來源可能是壓縮包、網(wǎng)絡(luò)、運(yùn)行時(shí)編譯出的或者自動(dòng)生成的class文件,jvm spec沒有規(guī)定必須從什么地方加載。

      類裝載的兩種方式:

      1.Class c1 = Class.forName ("java.lang.String"); 

      2.ClassLoader cl = new  ClassLoader(); 

      Class cl.loadClass( String name, boolean resolve );


      兩種裝載方法的區(qū)別:


      不同的類裝載器


        Class.forName是從指定的classloader中裝載類,如果沒有指定,也就是一個(gè)參數(shù)的時(shí)候,是從裝載當(dāng)前對(duì)象實(shí)例所在的classloader中裝載類。

        而ClassLoader的實(shí)例調(diào)用loadclass方法,是指從當(dāng)前ClassLoader實(shí)例中調(diào)用類,而這個(gè)實(shí)例與裝載當(dāng)前所在類實(shí)例的Classloader也許不是同一個(gè)

            說白了就是他們實(shí)現(xiàn)裝載的時(shí)候,使用的類裝載器的指定是不同的。那為什么使用不同的ClassLoader來裝載類呢?

            其實(shí)使用多個(gè)classloader加載類的情況非常常見,比如說我們的app server都是這樣的WebEJB他們的classLoader就是不同的,這樣做的目的就是為了避免兩者間類裝載的相互干擾。


      是否實(shí)例化類


            Class的裝載分了三個(gè)階段,loading(裝載),linking(連接)和initializing(實(shí)例化)分別定義在The Java Language Specification12.2,12.312.4。

       Class.forName(className)實(shí)際上是調(diào)用Class.forName(className, true, this.getClass().getClassLoader())。注意第二個(gè)參數(shù),是指Classloading后是不是必須被初始化。

          ClassLoader.loadClass(className)實(shí)際上調(diào)用的是ClassLoader.loadClass(name, false),第二個(gè)參數(shù)指出Class是否被link。

          區(qū)別就出來了。Class.forName(className)裝載的class已經(jīng)被實(shí)例化,而ClassLoader.loadClass(className)裝載的class還沒有被link,所以就更談不上實(shí)例化了。

        一般情況下,這兩個(gè)方法效果一樣,都能裝載Class。但如果程序需要Class實(shí)例化,就必須用Class.forName(name)了。

      例如,在JDBC中加載mysql的驅(qū)動(dòng)類時(shí)(關(guān)于注冊(cè)jdbc驅(qū)動(dòng)請(qǐng)參看另外一篇文章,jdbc注冊(cè)驅(qū)動(dòng)的三種方式),Class.forName("com.mysql.jdbc.Driver"),如果換成getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行,因?yàn)樗皇窍騤vm裝載了Driver并沒有實(shí)例化,就不能執(zhí)行響應(yīng)的操作。

       打開com.mysql.jdbc.Driver的源代碼看看,

      //

      // Register ourselves with the DriverManager

      //

      static {

          try {

              java.sql.DriverManager.registerDriver(new Driver());

          } catch (SQLException E) {

              throw new RuntimeException("Can't register driver!");

          }

      }

      可以看到,Driverstatic塊中會(huì)注冊(cè)自己到java.sql.DriverManager。而static塊就是在Class的初始化中被執(zhí)行。所以這個(gè)地方就只能用Class.forName(className)


      資源



        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多