Как я могу получить имя метода с аннотацией?

Например, класс Exam имеет несколько методов с аннотацией.

@Override
public void add() {
    int c=12;
}

Как я могу получить имя метода (добавить) с аннотацией @Override, используя org.eclipse.jdt.core.IAnnotation?


person Anu    schedule 11.06.2012    source источник
comment
Действительно ли необходимо использовать org.eclipse.jdt.core.IAnnotation?   -  person Apoorv    schedule 11.06.2012
comment
Просто чтобы уточнить, вы создаете плагин eclipse, который использует части JDT?   -  person Andrew Eisenberg    schedule 12.06.2012
comment
нет необходимости использовать org.eclipse.jdt.core.IAnnotation.   -  person Anu    schedule 12.06.2012


Ответы (3)


IAnnotation сильно вводит в заблуждение, см. документацию.

Чтобы получить методы из класса, которые имеют некоторую аннотацию. Для этого вам нужно перебрать все методы и получить только те, у которых есть такая аннотация.

public static Collection<Method> methodWithAnnotation(Class<?> classType, Class<?  extends Annotation> annotationClass) {

  if(classType == null) throw new NullPointerException("classType must not be null");

  if(annotationClass== null) throw new NullPointerException("annotationClass must not be null");  

  Collection<Method> result = new ArrayList<Method>();
  for(Method method : classType.getMethods()) {
    if(method.isAnnotationPresent(annotationClass)) {
       result.add(method);
    }
  }
  return result;
}
person Damian Leszczyński - Vash    schedule 11.06.2012

Вы можете использовать отражение, чтобы сделать это во время выполнения.

public class FindOverrides {
   public static void main(String[] args) throws Exception {
      for (Method m : Exam.class.getMethods()) {
         if (m.isAnnotationPresent(Override.class)) {
            System.out.println(m.toString());
         }
      }
   }
}

Изменить. Чтобы сделать это во время разработки/разработки, вы можете использовать описанный метод здесь.

person Apoorv    schedule 11.06.2012

Другое простое решение JDT, использующее AST DOM, может быть следующим:

public boolean visit(SingleMemberAnnotation annotation) {

   if (annotation.getParent() instanceof MethodDeclaration) {
        // This is an annotation on a method
        // Add this method declaration to some list
   }
}

Вам также необходимо посетить узлы NormalAnnotation и MarkerAnnotation.

person Unni Kris    schedule 11.11.2014