2012-01-26 7 views
4

健全な質問をしているかどうかわからない。私はすべての内部クラスが、囲むクラスオブジェクトへの参照を保持していることを知っています。だから私は関数パラメータとして、匿名の内部クラスを与え、その囲むクラスの外に囲んでいるクラスオブジェクトを参照できますか?あなたはこのtBの内部クラスであるかどうかを確認するために行うことができます関数パラメータとして匿名の内部クラスから囲むクラスオブジェクトを取得する

class A{ 
    public static void foo(Thread t) { 
     //here, how to get the reference of the enclosing class object of "t", 
     //i.e. the object of class B. I know, somebody might have put in a 
     //non-inner class Thread. But how can I check if "t" is really from an 
     //anonymous inner class of class B and then do something here? 
    } 
} 
class B{ 
    public void bar() { 
     A.foo(
     new Thread() { 
      public void run() { 
       System.out.println("inside bar!"); 
      } 
     }); 
    } 
} 
+0

http://stackoverflow.com/questions/471749/can-i-discover-a-java-class-declared-inner-classes-using-reflectionの複製と思われます –

+0

クラスのみが必要ですか囲むクラスの実際のインスタンス? – Thomas

+0

@トーマス:どちらもできますか? –

答えて

7

t.getClass().getEnclosingClass()を試してみてください。囲むクラスがない場合はnullが返されることに注意してください。

添付するクラスの正しいインスタンスを取得することは、文書化されていない実装の詳細(つまりthis$0変数)の一部に依存するため、簡単ではありません。ここではいくつかのより多くの情報があります:In Java, how do I access the outer class when I'm not in the inner class?

編集:私はthis$0アプローチが文書化されていないで、コンパイラに依存する可能性があることを再び強調したいと思います。したがって、プロダクションまたはクリティカルなコードには依存しないでください。

+0

私はここに留学したと確信しています。 –

+0

@QiangLiそれは問題ではありません。リンクされた質問の外部インスタンスを取得するメソッドは、外部クラスにあるように起こりますが、必ずしもそうである必要はありません。 – Thomas

+0

OK。メソッド 'A.foo'の中から外部クラスのインスタンスにアクセスするための例を完了できますか? –

0

tの包含するクラスを取得するための

public static void foo(Thread t) { 
    System.out.println(t.getClass().getName().contains("B$")); 
    // OR 
    System.out.println(t.getClass().getEnclosingClass().equals(B.class)); 
} 
関連する問題