実際、これがどれほどトリッキーなのか、私にはわかりません。
更新、contains 関数を含めるのを忘れ、Annotation.getClass() を Annotation.annotationType() に切り替えるのを間違えました。このコードは機能します
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Mark
public @interface A {}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface B {}
@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.TYPE)
public @interface Mark {}
public class C {
@A @B public void f() {}
}
public class Solver {
public static boolean contains(Annotation a, Class<?> targetAnnotation) {
Class<?> c = a.annotationType();
Annotation[] cas = c.getAnnotations();
for (Annotation aa : cas) {
if (aa.annotationType().equals(targetAnnotation)) {
return true;
}
}
return false;
}
public static Annotation[] getMarked(Method m) {
List<Annotation> retVal = new ArrayList<Annotation>();
for (Annotation a : m.getAnnotations()) {
if (contains(a.getClass().getAnnotations(), Mark.class) {
retVal.add(a);
}
}
return retVal.toArray(new Annotation[]{});
}
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
Annotation[] result = getMarked(C.class.getMethod("f"));
}
} // solver
これには、すべての注釈が実行時レベルの保持でマークされている必要があることに注意してください。おそらく、実際の型 (私の例では A.class) でいっぱいの Class[] を返したいと思うでしょう。