2015-10-08 7 views
5

呼び出し元クラスのインスタンスオブジェクトを取得することがどうにかできますか?呼び出し側のインスタンスを取得する(リフレクションを介して)

class A{ 
    void foo(){ 
     Object o = getCaller(); //?? expect instance of B 
     long val1 = ..   // get val1 of o via reflection 
     // do something where val1 is crucial 
    } 
} 

class B{ 
    double val1 = Math.random(); 

    public static void main(String[] args) { 
     new B().callFoo(); 
    } 

    void callFoo(){ 
     new A().foo(); 
    } 
} 

私はスタックトレースを経由して、クラス/メソッドを呼び出す見つけることができることを知っているが、私は(例ではval1と同様)インスタンス変数にアクセスするためにconreteインスタンスを必要としています。

私はそれが汚いと知っていますが、クラスBは変わらないライブラリにあり、すべてを再構築せずに必要なフィールドを渡すことはほとんど不可能です。

+1

でfooメソッドに呼び出し元のコードのインスタンスを渡します:あなたは次の操作を行うことができインスタンスを渡すために

?なぜあなたはそれを必要としますか? –

+4

いいえ、あなたは基本的にこれを行うことはできません。 –

答えて

2

インスタンスが何らかの形で渡されたり、コレクションに格納されたりしない限り、呼び出し元のインスタンスにアクセスすることはできません。

class A{ 
    void foo(Object caller){ 
     long val1 = ..   
     // do something where val1 is crucial 
    } 
} 

class B{ 
    double val1 = Math.random(); 

    public static void main(String[] args) { 
     new B().callFoo(); 
    } 

    void callFoo(){ 
     new A().foo(this); 
    } 
} 

「これ」keyworkはインスタンスが存在しない場合は何クラスA

関連する問題