21

リフレクションを使用して、クラスのプロパティにアタッチされているアノテーションが特定のタイプであるかどうかを確認しています。現在私がしていること:

if("javax.validation.Valid".equals(annotation.annotationType().getName())) {
   ...
}

これは、完全修飾されたクラス名である文字列に依存しているため、少し厄介だと思います。将来、名前空間が変更された場合、微妙なエラーが発生する可能性があります。

私がしたいのは:

if(Class.forName(annotation.annotationType().getName()).isInstance(
     new javax.validation.Valid()
)) {
   ...
}

ただしjavax.validation.Valid、これは抽象クラスであり、インスタンス化することはできません。インターフェイスまたは抽象クラスに対してシミュレートするinstanceof(または基本的に使用する)方法はありますか?isInstance

4

5 に答える 5

48

あなたはただ探していますか

if (annotation.annotationType().equals(javax.validation.Valid.class)){}

于 2010-07-27T22:00:41.547 に答える
24

またはさらに簡単:

if (annotation instanceof Valid) { /* ... */ }
于 2011-05-10T13:48:07.780 に答える
12

完全を期すために、別の可能性は

if (this.getClass().isAnnotationPresent(MyCustomAnnotation.class)) {
于 2010-12-21T16:04:39.397 に答える
5

わかりました。質問を投稿する前に、もう少し調査を行うべきだったと思います。私は使用できることを発見しましたClass.isAssignableFrom(Class<?> cls)

import javax.validation.Valid;

if(Valid.class.isAssignableFrom(annotation.annotationType())) {
   ...
}

これでうまくいくようです。ただし、このアプローチを使用する際の注意点があるかどうかはわかりません。

于 2010-07-27T21:59:24.127 に答える
3

アノテーションは単なるクラスであるため、==compareを使用するだけです。

if (annotation.annotationType() == Valid.class) { /* ... */ }
于 2010-07-27T22:04:38.377 に答える