反射中ClassforName()とClassLoader.loadClass()の違い

4041 ワード

転載先http://www.cnblogs.com/zabulon/p/5826610.html http://blog.csdn.net/qq_27093465/article/details/52262340
一、Javaクラスのロードプロセス
反射中Class.forName()和ClassLoader.loadClass()的区别_第1张图片
  :                ,                      ,      Java.lang.class  ; 

  :       、       ,            ; 

    :                  ;(      ,     ,     ,      ) 

    :                 ; 

    :                ; 

   :            Java     Java   ,             。


二、分析Class.forName()とClassLoader.loadClass
    
Class.forName(className)  ,            Class.forName(className,true,classloader);

 2 boolean            ,  Class.forName(className)        。

     ,          static     ,static           。

    

ClassLoader.loadClass(className)  ,            ClassLoader.loadClass(className,false);

 2  boolean  ,            ,false       ,       ,

                      ,                 



class.forName()はクラスを除く.classファイルはjvmにロードされるほか、クラスを解釈し、クラスのstaticブロックを実行します.
classLoaderはただ一つのことをします.classファイルはjvmにロードされ、staticの内容は実行されず、newInstanceでのみstaticブロックが実行されます.
Class.forName(name,initialize,loader)パラメータ付き関数はstaticブロックをロードするかどうかを制御することもできます.またnewInstance()メソッドを呼び出した場合のみ呼び出し構造関数を使用してクラスのオブジェクトを作成します.
三、データベースリンクはなぜClassを使うのか.forName(className)
 
JDBC Driverのソースコードは以下の通りなのでClassを使用する.forName(classname)は、クラスに戻るときにstaticブロックを実行することができます.
static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}