2015-05-29 1 views
0

Предположит, что у меня есть этот класс аннотацииJava отражение - искать метод с конкретной аннотацией и его аннотацией элемента

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface MethodXY { 
    public int x(); 
    public int y(); 
} 

public class AnnotationTest { 
    @MethodXY(x=5, y=5) 
    public void myMethodA(){ ... } 

    @MethodXY(x=3, y=2) 
    public void myMethodB(){ ... } 
} 

Так есть способ взглянуть на объект, «искать» из метода с @MethodXY аннотация, где его элемент x = 3, y = 2 и вызывать его?

Этот вопрос уже ответил here using core Java Reflection. Я хочу знать, можно ли это сделать с помощью Reflections 0.9.9-RC1 API без необходимости перебора методов с использованием некоторых для кода цикла или путем написания метода прямого сравнения, где я могу искать метод с заданными параметрами в качестве ключа или чего-то еще.

+0

Что вы попробовали? Этот вопрос выглядит * на данный момент * слишком похож на запрос кода –

+0

@RC Я принял множество методов с указанными методами, используя API отражений, но мне нужно выполнить итерацию по набору, чтобы сравнить параметры. Я хочу, чтобы избежать итерации, если есть уже доступный метод. – Mukund

+0

Я довольно уверен, что итерация по всем аннотированным методам является обязательной в этом случае. –

ответ

0

Что-то, как это будет делать то, что:

public static Method findMethod(Class<?> c, int x, int y) throws NoSuchMethodException { 
    for(Method m : c.getMethods()) { 
     MethodXY xy = m.getAnnotation(MethodXY.class); 
     if(xy != null && xy.x() == x && xy.y() == y) { 
      return m; 
     } 
    } 
    throw new NoSuchMethodException(); 
} 

public static void main(String[] args) throws Exception { 
    findMethod(AnnotationTest.class, 3, 2).invoke(new AnnotationTest()); 
    findMethod(AnnotationTest.class, 5, 5).invoke(new AnnotationTest()); 
} 
+0

Это именно то, что я хочу. Просто хочу знать, можно ли это сделать без меня, чтобы написать метод findMethod – Mukund

0

Конечно, вы можете сделать это с Reflections#getMethodsAnnotatedWith().

Вы можете найти ответ here.

+0

'Reflections # getMethodsAnnotatedWith()' возвращаемый набор аннотированных методов. Я хочу что-то вроде 'Reflections # getMethodsAnnotatedWith (MethodXY.class, 3,2)' – Mukund

+0

Использование java8: getMethodsAnnotatedWith (MethodXY.class) .stream(). Filter (method -> method.getAnnotation (MethodXY.class) .getX() == 3 && method.getAnnotation (MethodXY.class) .getY() == 2) .map (method -> method.invoke (this)); Это найдет все методы с X = 3 и Y = 2 и вызовет их. – hammelion

Смежные вопросы