1

私は抽象クラスを与えられました:

public abstract FooPACImpl {
    ...
}

そして、2 つの自動生成されたサブクラス:

public replyTypeFooPAC extends FooPACImpl {
    ...
}
public requestTypeFooPAC extends FooPACImpl {
    ...
}

そして、リクエスト タイプとリプライ タイプを使用するネットワーク パターン (リクエスト/リプライ) を作成するための API (A と B は、上記のように FooPACImpl の自動生成されたサブクラスであることが期待されます):

Replier<A, B> get_simple_replier (
    String topic, 
    Object<A> requestType, 
    Object<B> replyType) {...}

Requester<A, B> get_simple_requester (
    String topic, 
    Object<A> requestType, 
    Object<B> replyType) {...}

トピック文字列と、2 つの型 A と B の文字列名を XML スタブから取得します。

<rr>
    <topic>MyReqRepTopic</topic>
    <reqtype>foo.bar.baz.myReqTypeFooPAC</reqtype>
    <replytype>foo.bar.baz.myReplyTypeFooPAC</replytype>
</rr>

明らかに、Java のリフレクションは「パブリック抽象」スーパー クラスを直接処理できませんか?

FooPACImpl foopa = (FooPACImpl) Class.forName(reqtypeName).newInstance();

結果は

java.lang.IllegalAccessException: Class foo.bar.fnorb.ServiceSupport \
    can not access a member of class foo.bar.baz.myReqTypeFooPAC with \
    modifiers "protected"

1) なぜ「修飾子を「保護」する」のですか? FooPACImpl.getClass().getModifiers は「public abstract」を返します

2) クラスが抽象的であるため、この例外がスローされますか? それとも、可能なコンストラクター 'protected FooPACImpl () { };' と関係がありますか?

3) そして、これは達成可能ですか? 私の理解では、AA を BB でサブクラス化すると、BB が期待される場所で AA を使用できるということです。BB には、AA に期待されるもの (メソッド、フィールドなど) がすべて含まれるためです。とはいえ、お久しぶりです。Java での継承の詳細について、私は少しぼんやりしているかもしれません。

ポイント/ポインターに感謝します。#3のはい/いいえの答えで十分です。「いいえ」の場合は、リフレクションなしで実装する方法を示します。自動生成されたもののコード ジェネレーター テンプレートにアクセスできます。

4

1 に答える 1

2

FooPACImpl の自動生成されたサブクラスには、2 つの保護されたコンストラクターがありました。

protected myReqTypeFooPAC() {
    super(...);
}

protected myReqTypeFooPAC(boolean b) {
    super(..., b, ...); 
}

親クラスの問題を探していましたが、コンストラクタの問題であることが判明しました。それらをパブリックに変更すると、コードが期待どおりに実行されるようになりましたが、リフレクションを使用して実行できますか? または codegen テンプレートを変更することによって...

于 2014-08-21T10:09:00.307 に答える