私は抽象クラスを与えられました:
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のはい/いいえの答えで十分です。「いいえ」の場合は、リフレクションなしで実装する方法を示します。自動生成されたもののコード ジェネレーター テンプレートにアクセスできます。