私は、Java クラスのメタデータ (バイト コードとリフレクション) を多く扱う基本的なプログラミング プロジェクトに取り組んでいます。特定する非常に一般的なケースがあります。
- メソッドにはアノテーションがありますか
- 2 つのメソッドに同じアノテーションがあるかどうか、メソッドの 1 つが別のメソッドをオーバーライドするかどうかを判断するにはどうすればよいですか?
最初の質問では、次のようにクラス T とクラス S の 2 つのクラスがあるとします。
public class T<O extends T<?>> {
public void print(S o) {}
@Transition
public void print(O o) {}
}
public class S extends T<S> {
@Override
public void print(S o) {}
}
API をスマートにして、API ユーザーが @Transition をスーパークラスまたはインターフェースに配置できるようにする場合、サブクラスのオーバーライド メソッドに @Transition を配置するのと同じ効果が得られます。現在、これが可能かどうかはわかりませんが、クラス T で S.print(S) がオーバーライドするメソッドをどのように判断すればよいですか?
2 番目の質問の場合、コードは次のようになります。
public class T<O extends T<?>> {
@Transition
public void print(S o) {}
@Transition(type=Redo.class)
public void print(O o) {}
}
public class S extends T<S> {
@Override
@Transition(type=Redo.class)
public void print(S o) {}
}
Redo タイプの @Transition メソッドは、クラス階層を通じて一度しか定義できないという制約があります。実行時にこの制約を検証しているときに、S.print(S) が T.print(S) または T.print(O) をオーバーライドし、異なる結果が生成されることをどのように判断できますか? そして状況はもっと曖昧かもしれません。jvmまたはコンパイラのネイティブ機能に似ているため、利用可能なアルゴリズムはありますか? それともこれを達成することは可能ですか?それとも、他の方向を見つける必要がありますか?