1

私は、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またはコンパイラのネイティブ機能に似ているため、利用可能なアルゴリズムはありますか? それともこれを達成することは可能ですか?それとも、他の方向を見つける必要がありますか?

4

2 に答える 2

0

Method.getDeclaringClass() が、メソッドを取得したクラスとは異なる値を返す場合、それはオーバーライドまたはインターフェイスの実装であり、宣言クラスを見ることでどちらかを知ることができます。

于 2013-11-01T07:48:33.503 に答える