最初に、明確化:「インターフェース」とは、必ずしもコンポーネントの相互作用のポイントを意味し、必ずしも「抽象タイプ」のインターフェースの種類ではない。 (私はこのようなインターフェイスを使用することができますが、これは素晴らしいです。)別のクラスでプライベート変数にアクセスできるようにするインターフェイスを提供できますか?
私は拡張するように設計されたクラスを書いています。問題のドメインはグローバルな最適化です。つまり、自分のクラスをサブクラス化するエンドユーザプログラマ(私はSteveと呼ぶでしょう)は、それを解決するための独自の問題とアルゴリズムを提供します。私はフレームワーク(ネットワーク、ユーザーインターフェイスなど)を提供するだけです。 Steveのプログラムにはいくつでも設定が必要な場合があります。自分の設定が(GUIコントロールパネルやXML設定ファイルなどから)自分の設定を取得するのと同じ方法で、自分のコードをユーザから取得できるようにしたい。スティーブは自分のコードを複製する必要はありませんし、Javaの型安全性やカプセル化モデルを破る必要もありません。
理想的には、スティーブは、これらの線に沿って何かを書くことができるようになります
public class SteveClass extends MyFrameworkClass {
@Configurable
private int foo;
@Configurable
private String bar;
private boolean baz;
// implementations of my abstract methods, etc.
}
Configurable
は、注釈付きの変数が、私は、ユーザーから取得する必要があり、構成設定であることを示していること、私が提供する注釈です。ご覧のとおり、私はSteveが自分の内部使用のために他のインスタンス変数を宣言できるようにしたいと思います。
MyFrameworkClass
には、getClass().getDeclaredFields()
を繰り返し、Configurable
アノテーションを持つフィールドを識別するメソッドを含めることで、これを実装しようとしていました。次に、これらのフィールドにユーザー入力を書き込みます。注釈とすべてで、これを正確に見る必要はありませんが、あなたはそのアイデアを得ることができます。
もちろん、この問題は、foo
とbar
がプライベートであり、MyFrameworkClass
のコードは、それをそのまま反映することはできません。スティーブのコードは私と同じパッケージには入っていないので、パッケージ非公開であれば助けにならないでしょう。私は彼に公開させたり、他の誰かを許可するインターフェイスを追加する必要はありません私はフィールドにアクセスする。
SecurityManager
で手を加えるか、まったく違うことをして、私が欲しいことをする方法はありますか?
マップを使用してパラメータを保存する方法と、変数名を格納するリストを使用する方法について教えてください。マップを使用して直接作業することができます(パラメータを繰り返して取得するか、パラメータ名を含むListを持つことができます)。 – Manish
@ManishSharmaタイプの安全性。 – Taymon
'protected'キーワードを使用して、サブクラスのアクセスを許可します。スーパークラスがサブクラスの保護されたフィールドにアクセスするためにリフレクションを使用しようとしたときに、JVMが何を考えるのか分かりません。 – Dunes