2012-07-25 7 views
6

クラスローダーに関するいくつか質問があります。どのクラスローダーが使用されていますか?

Class.forName("class.name"); 

.... 
NotYetLoadedClass cls = new NotYetLoadedClass(); 
..... 

はどのようなクラスローダーは、それぞれの場合に使用されるのでしょうか?最初のケースでは、メソッド・コードが実行されているクラスをロードするために使用されたクラス・ローダーを想定しています。 2番目のケースでは、スレッドコンテキストクラスローダを想定しています。

私が間違っている場合は、小さな説明をいただければ幸いです。

+5

最初のケースについては、http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29を参照してください(あなたの想定は正しい)。良い説明については、[この質問](http://stackoverflow.com/questions/1771679/difference-between-threads-context-class-loader-and-normal-classloader)も参照してください。 – DNA

答えて

2

両方とも現在のClassLoaderを使用しています。 DNAが正しく指摘するように、http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29には、現在のクラスローダを使用するClass.forName()が記載されています。少し実験はnew文を使用してインスタンス化のためにロードされたクラスは、現在のClassLoader使用していることを示しています。私たちはいくつかのカスタムClassLoaderに、現在のスレッドのContextClassloaderを設定し、クラスSomeClassのオブジェクトをインスタンス化Test

public class Test 
{ 
    public static void main(String[] args) throws Exception 
    { 
     Thread.currentThread().setContextClassLoader(new MyClassLoader()); 
     SomeClass someClass = new SomeClass(); 
     someClass.printClassLoader(); 
    } 

    public static class MyClassLoader extends ClassLoader 
    { 
     public MyClassLoader() 
     { 
      super(); 
     } 

     public MyClassLoader(ClassLoader parent) 
     { 
      super(parent); 
     } 
    } 
} 



public class SomeClass 
{ 
    public void printClassLoader() 
    { 
     System.out.println(this.getClass().getClassLoader()); 
     System.out.println(Thread.currentThread().getContextClassLoader()); 
    } 
} 

SomeClassでは、現在のスレッドのContextClassLoaderとこのオブジェクトのクラスをロードしたClassLoaderを出力します。結果は、(sun.misc.Launcher.AppClassLoaderClassLoader電流がクラスをロードするために使用されたことを示す

[email protected] 
[email protected] 

あります。

+0

"現在の' ClassLoader'はどういう意味ですか? – jameshfisher

+0

@jameshfisher "現在のクラスの定義クラスローダー" – Uli

+0

"現在のクラス"はどういう意味ですか?レキシカルスコープ? – jameshfisher

関連する問題