2011-07-01 2 views
3

カスタムクラスローダーを作成したいと思います。しかし、loadClass()と混同されていますが、このメソッドは指定されたクラスをメモリにロードしますか?classLoaderのloadClass()はクラスをメモリにロードしますか?

はいの場合、指定されたクラスの静的ブロックが呼び出されないのはなぜですか?

//main class 

package custom_class_loader1; 


public class Custom_class_loader1 { 


    public static void main(String[] args) { 

     try{ 
     CustomClassLoader c=new CustomClassLoader(); 
     Class c1= c.loadClass("custom_class_loader1.ABC");/**does this load ABC class into memory?**/ 

     }catch(Exception e) 
     { 
      System.out.println(e); 

    } 
} 
} 

答えて

7

クラスをロードすると、デフォルトで使用されるまで、クラスは初期化されません。

このメソッドを呼び出すことは、loadClass(name、false)を呼び出すことと同じです。

ここでfalseは、クラスを解決しないことを意味します。これを制御する

一つの方法は、Class.forNameの()

public class Main { 
    public static void main(String[] args) throws ClassNotFoundException { 
     ClassLoader cl = new URLClassLoader(new URL[0], ClassLoader.getSystemClassLoader()); 
     System.out.println("unresolved Test"); 
     cl.loadClass("Test"); 
     // or 
     Class.forName("Test", false, cl); 

     System.out.println("\ninitialise Test"); 
     Class.forName("Test", true, cl); 
    } 
} 

class Test { 
    static { 
     System.out.println("Loaded Test class"); 
    } 
} 

プリントクラスABCの静的ブロックが起動されていない、なぜ

unresolved Test 

initialise Test 
Loaded Test class 

+1

+1。ロード、リンク、初期化の3つのステップがあります。 'loadClass'はステップ2の後に終了します。 –

1

それ以外はロードしますか? loadClassは、ロードされたクラスを表すタイプClass<?>のオブジェクトを返します。

+0

を使用することである?????? –

+0

初期化時にstaticブロックが呼び出されます –

関連する問題