3

この質問は、Java プログラミング言語のリフレクション メカニズムに関するものです。

私はインターフェースを持っています:

package A;

public interface MyInterface {

    public boolean doSomething(Object... parameters);
}

このインターフェースにはいくつかの実装クラスがあります。ここにいくつかの例があります:

package B;
import A.*;

abstract class BaseImplementation implements MyInterface {

    private Object field;

    protected BaseImplementation() {

        super();
    }

    public void setField(Object aField) {

        field = aField;
    }

    public Object getField() {

        return field;
    }
}

package B;
import A.*;

public class ConcreteImplementation extends BaseImplementation {

    public ConcreteImplementation() {

        super();
    }

    ...

    // The concrete implementation provides an implementation for all
    // inherited abstract methods. Apart from this no other methods
    // are overridden.
    // This concrete class provides accessor methods for all of its own
    // private fields.

    ...
}

(編集済み)補足として(これはリフレクションメカニズムに関する問題とは関係ないかもしれません):

複雑なルールセットを実装しています。このルールセットの欠点の 1 つは、オブジェクト間に多くの相互依存関係があることです。したがって、インターフェイスの一般的な動作を定義する必要があります。ルールセットの一部を実装する場合、まだ実装されていない別の部分の動作を考慮する必要があります。

インターフェイスの実装が異なれば、適切に機能するために異なるリソース/オブジェクトが必要になります。重複コードを減らすために、抽象親クラスを使用します。これらの抽象クラスは、パッケージの外では使用されません。

具体的な実装クラスのインスタンスをインスタンス化して初期化するとき、私はリフレクション メカニズムに頼っています。この目的のために、目的のクラス名、どのフィールドがどの値を取得するか (つまり、適切なセッター メソッドが検索される)、およびセッター メソッドの順序を指定する必要があるユーティリティ クラス (別のパッケージに存在する) があります。呼ばれます。

2 つの異なる開発環境があり、それぞれに異なるバージョンの Java がインストールされています (1.5.x と 1.6.x)。これは主に、実装の動作をクロスチェックするために使用されます。

具象実装クラスのインスタンスのインスタンス化は、両方の環境で機能します。ただし、古い Java バージョンでは初期化に失敗します。どういうわけか、基本クラス (基本クラスにはデフォルトの可視性があります) のパブリック セッター メソッドにアクセスできません。新しい Java バージョンでは、setter メソッドへのアクセスに問題はありません。

私が見つけた 1 つの回避策は、基本クラスの可視性を変更することです (デフォルト -> パブリック)。問題は、可視性 (デフォルト) を維持しながら、リフレクション メカニズムを使用してセッター メソッドを呼び出す方法があるかどうかです。

4

1 に答える 1

1

使用できるセキュリティ制限に応じて

AccessibleObject.setAccessible(boolean);

(AccessibleObject は Field、Method、Constructor によって実装されるインターフェースです)。リフレクションを呼び出す前に、method.setAccessible(true); を呼び出すだけです。リフレクション オブジェクトで、SecurityManager が例外をスローしない限り、問題ないはずです。

于 2011-11-09T19:44:38.890 に答える