0

最初のクラス内で作成された別のクラスから、クラスのフィールドに含まれる情報にアクセスできるかどうか疑問に思っています。やりたいことを示すために、Javaコードのスニペットを入れました。

    public class A {
      public String c = new String();
      B b;
      ...
      ...
      ...
      public void doSomething() {

        b = new B();
      }
    }

    public class B {        

      ...
      ...
      ...
      public void retrieveInformationFromA() {

        // I need to retrieve the field "c" of A instance that's 
        // created the B instance 
      }
    }

注: このコードの現在の設計の制限により、クラス A のフィールド "c" のパラメーターを含むコンストラクターを B で作成することはできません。レガシー コードのため、既存のコードをできるだけ変更しないようにする必要があります。

どんな助けにも感謝します!!

更新: コードを修正しました。A のフィールド "c" に public 修飾子を追加するのを忘れていました。

4

5 に答える 5

1

フィールド 'c' に可視性 (public、private、protected) を指定しなかったため、「保護されたパッケージ」であることが暗示されます。つまり、クラス A と同じパッケージ内のすべてのクラスがそのフィールドに直接アクセスできます。

したがって、クラス A と B が同じパッケージにある場合、クラス B からフィールド 'c' に直接アクセスできます。

それらが同じパッケージにない場合、通常はアクセスできませんが、リフレクションを使用する必要があります (これは絶対的な最後の手段である必要があります): How do I read a private field in Java?

編集:しかし、クラスAのインスタンスへの参照をクラスBに渡す必要があります。クラスBを変更できない場合は、完全に運が悪いです。

于 2013-11-08T09:52:05.897 に答える
1

文字列を静的として宣言する

public class A {
  static String c = new String();

そして、Bのようにアクセスします

  public void retrieveInformationFromA() {

     String info = A.c;

    // I need to retrieve the field "c" of A instance that's 
    // created the B instance 
  }

c が異なるか非静的である必要がある場合

  public void retrieveInformationFromA() {


     A obj = new A();
     String info = obj.c;

    // I need to retrieve the field "c" of A instance that's 
    // created the B instance 
  }
于 2013-11-08T09:52:18.850 に答える
1

私の経験では、それは不可能です。呼び出されたインスタンス b は、あなたが伝えたものを除いて、それを取り巻く世界についての知識を持っていません。c を static として宣言したくない場合、または宣言できない場合は、クラス B のセッターを含めて 'c' を渡すことができます。

もう 1 つのメソッドは、1 つまたは複数の異なるクラスが必要とするフィールドを含む中間の「InfoBase」クラスである可能性があります。

于 2013-11-08T09:53:32.983 に答える
1

クラス A のプライベート メンバーであるため、A のフィールド "c" を取得することはできません。ハッピーコーディング:)

于 2013-11-08T09:53:56.510 に答える