你认为你是一个java向导吗?
您是否精通反射API的秘密?
public @interface @a {}
public @interface @b {}
@Mark public @interface @c {}
@Mark public @interface @d {}
public @interface @e {}
public Class C
{
@a @b @c @d @e public void x();
}
public class Solver
{
public Annotation[] solve(Method m, Class c);
}
你必须编写方法求解,所以如果在方法C.x()和Mark.class上调用它,它将返回{c,d}。
(这不是家庭作业,是我正在努力开发的框架元编程框架的真正编程任务)
答案 0 :(得分:6)
这是经过测试的。它确实比本来应该更难。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface a{}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface b{}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
public @interface Mark{}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Mark
public @interface c{}
public static class D {
@a @b @c
public void x() {}
}
public static void main(String[] args) throws Exception {
Method m = D.class.getMethod("x");
Collection<Annotation> ret = new HashSet<Annotation>();
Annotation[] annotations = m.getAnnotations();
for (Annotation annotation : annotations) {
Annotation subAnnots = annotation.annotationType().getAnnotation(Mark.class);
if (subAnnots != null) {
ret.add(annotation);
}
}
System.out.println(ret);
}
我想它只是提出了为什么annotationType()有效,但getClass()没有。
答案 1 :(得分:1)
实际上,我不知道这甚至是多么棘手。
更新,忘记包含contains函数,并且错误地使用Annotation.annotationType()切换Annotation.getClass()。此代码有效
@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
请注意,这要求所有注释都标记为运行时级别保留,并且返回Annotation []可能不是您想要的。你可能想要返回一个完整的实际类型的Class [](在我的例子中,A.class)