2017-10-25 7 views
1

他のクラスをインスタンス化して使用するクラスがあるとします。 2番目のクラスから、最初のクラスへのアクセスが可能ですか?たとえば :Javaでは、そのクラスが作成/使用しているオブジェクトの内部からオブジェクトにアクセスする方法はありますか?

private String getCallerClassName() { 
    StackTraceElement[] stElements = Thread.currentThread().getStackTrace(); 
    for (int i = 1; i < stElements.length; i++) { 
     StackTraceElement ste = stElements[i]; 
     if (!ste.getClassName().equals(B.class.getName()) && ste.getClassName().indexOf("java.lang.Thread") != 0) 
      return ste.getClassName(); 
    } 
    return null; 
} 

私は別の質問から得た:How to get the caller class in Java

public class A { 
    public B obj = new B(); 

    public void something() { 
     b.somethingElse(); 
    } 
} 

public class B { 
    public void somethingElse() { 
     A owner = getCallingObject(); 
     //the object of class A that called b.somethingElse() is now stored in owner 
    } 

    public Object getCallingObject() { 
     // ????? 
     // returns the A that instantiated/owns this B 
    } 
} 

私はこのようなものを使用して、そのオブジェクトのクラスを取得する方法を知っています。 呼び出し元オブジェクトへのポインタを取得する方法はありますか?

+4

申し訳ありませんが、Javaはそのように動作しません。 'B'に' A'を逆参照したい場合は、自分で作成する必要があります。 –

+6

'b.somethingElse(this);' –

+0

メソッドシグネチャを変更したり、 'A'を' B'に渡すことができない場合は、 'bを呼び出す前にThreadLocalに' A'を入れることができるThreadLocalを使用できます。 somethingElse(); 'を呼び出し、' somethingElse'メソッドの中のThreadLocalから取得します。 AOPを使用してこれをさらに自動化することができます。 – tsolakp

答えて

1

あなたはソースコードを制御し、BのみAオブジェクトによって作成することができるならば、あなたはB非静的内部クラスを作ることができ、その後、あなたは自動的にクラスのクリエイターへの参照を取得したい場合は、 A.thisポインタを使用します。これはB::somethingElse()の呼び出し元ではなく、作成者がBであることに注意してください。これはユースケースによっては同じものでも異なっていてもかまいません。

public class A { 
    public B obj = new B(); 

    public void something() { 
     obj.somethingElse(); 
    } 

    void thereAndBackAgain() { 
    } 

    public class B { 

     public void somethingElse() { 
      A owner = A.this; 
      owner.thereAndBackAgain(); 
     } 
    } 
} 
+0

ネストされたクラスがなくてもAを変更することはできませんか? – Hamrobe

+0

入れ子になっていないクラスはありませんか?確かに。 「A」を全く変更しないで?おそらくそうではありません。あなたは少なくともBのコンストラクタ 'new B(this)'または 'class A {...}'コードを変更している 'obj.somethingElse(this)'のどちらかに 'this 'を渡す必要があります。さもなければ、 "所有者"/"呼び出し元"がタイプAのオブジェクトであっても保証されません。いくつかのクラス 'Q'はあなたのパブリック' B'を作成し、パブリック 'somethingElse'メソッドを呼び出すことができます。 – AJNeufeld

+0

ありがとうございました!これは実際に多くの助けになりました – Hamrobe

関連する問題