1

私のJavaは少し錆びており、この問題の解決策を実装する必要があります.

A.java で指定:

public class A implements Cloneable{
  protected DataStorage Y = new DataStorage();

  public A(DataStorage X, about 20 other inputs of different Object types){
   this.Y=X;
  }

  public static DataStorage getData(){
   return this.Y;
  }
}

オブジェクトYまたはXを取得したい別のファイルServletA.javaでの私の目標。A.javaクラスから静的呼び出しを行うことによって...それは機能しますか、またはより良い方法がありますか?

public class ServletA{
  DataStorage Z = A.getData();
}

注: はい、これはコンパイルされませんが、解決策はありますか?

ソリューションに対する私の制約:

  • A.java はレガシー コードベースであるため、最小限の変更を加える
  • 悪夢である A() コンストラクターには 20 以上の入力が多数あります
  • 私のアーキテクトは、Aを抽象クラスに変更することによってもそれに触れたくありません
  • ServletA.java で A のインスタンスを作成できません

EDIT1:私の質問は、ServletA.java で A のインスタンスを作成せずに、ServletA.java から X にアクセスするソリューションがあるかどうかです。上記のコードは、方法を考えたことを示す例ですが、機能しません。

編集2:反対票を投じたい場合は、礼儀として説明を求めてください。ありがとう!

4

4 に答える 4

1

A のインスタンスが 1 つしかない場合は、シングルトンパターンを使用する必要があります。ServletA コードは次のようになります

public class ServletA {
  DataStorage Z = A.getInstance().getData();
}
于 2012-07-23T15:44:25.057 に答える
1

リフレクションを使用して、プライベート (またはプロテクト) クラスのフィールドとメソッドにアクセスできます。アイデアは、セキュリティを切り替え、フィールドまたはメソッドを取得し、参照を取得/メソッドを呼び出してから、セキュリティをオンにすることです。ハックのように見えますが、機能します。

少し前に、私はクラス「ClassRipper」を書きました (明らかに一から作り直しました)。「ClassRipper」でGoogle検索すると、それへの参照が得られます。

http://www.koders.com/java/fid7E7F02066CC24469AC29D8A3EB9F74D655E53588.aspx

あなたの仕事のための便利なツール。自由に使用または拡張してください。

これについては、StackOverflow に 2 つの同様のトピックがあります。

Javaでリフレクションを介してプライベートフィールドにアクセスすることは可能ですか?

Javaでプライベートフィールドを読み取るにはどうすればよいですか?

「EDIT1によるUPDATE:私の質問は、ServletA.javaでAのインスタンスを作成せずにServletA.javaからXにアクセスする解決策があるかどうかです。上記のコードは、私が方法を考えたことを示す例ですが、動作しません。」

A のインスタンスを作成せずに X にアクセスすることはできません - X は存在しません (静的ではないため)。ただし、ServletA が A を拡張する場合は、「this」をインスタンスとして使用できます。ClassRipper ハンドルの継承。この場合、間接的に A のインスタンスを持っています;)

于 2012-07-23T15:57:10.807 に答える
0

このコードはコンパイルできないと確信しています。this静的関数から参照することはできません。

のインスタンスを のコンストラクターに渡し、から削除することAができServletAます。staticA.getData

于 2012-07-23T15:40:19.710 に答える
-1

静的メソッドにはthis使用可能なポインターがないため、指定されたコードはコンパイルされません。getData()静的である必要がある理由はありますか?

于 2012-07-23T15:41:46.603 に答える