2014-09-16 2 views
0

Мой вопрос заключается в следующем: Пожалуйста помогите.Runtime Обработка аннотации

У меня есть аннотация, применимая к методам только что я хочу быть обработано во время выполнения, скажу

    @Target(ElementType.METHOD) 
        @Retention(RetentionPolicy.RUNTIME) 
        public @interface MyAnno { 
          String name();} 

А вот мой процессор:

    public class MyAnnoProcessor(Class cls){ 
         Method[] m = cls.getClass().getMethods(); 
         ...// read the value passed to name and create an instance of an object depending on the value of 'name' 

Да. MyAnnoProcessor код выглядит следующим образом:

   public class MyAnnoProcessor(Class cls){ 
       Method[] methods = cls.getMethods(); 
       for(Method m: methods){ 
        MyAnno an = (MyAnno) m.getAnnotation(MyAnno.class); 
        if(an!=null) 
         sysout(an.name()); 
         ....//call another method to create a class based on the value passed to 'name' 

Теперь у меня есть класс, где я хочу написать много методов аннотированных с @MyAnno, но каждый метод передает другое значение «имя». Я просто не могу найти способ обработать обработку аннотаций идеальным способом? Как «MyAnnoProcessor» знает, что (объект) нужно вернуть к какому методу?

Скажем, я делаю это в методе A:

   @MyAnno(name="testA") 
       public void A(){ 
        MyAnnoProcessor(this); 
       ...} 

И снова я сделать это в методе B:

    @MyAnno(name="testB") 
        public void B(){ 
        MyAnnoProcessor(this); 
        ...} 

'MyAnnoProcessor', кажется, читает значение 'имя' как «testA», а не «testB» в последующем вызове от метода B. Где я ошибаюсь? Пожалуйста, порекомендуйте.

+0

Вы можете вставить весь код для 'MyAnnoProcessor 'класс? Вы получаете все методы, но в какой-то момент вы должны различать 'A()' и 'B()' для правильной обработки аннотаций? – prabugp

+0

Вам нужно будет отредактировать свой вопрос и вставить код. Теперь я вижу еще меньше кода. – prabugp

+0

Да, отредактировал его в вопросе. Я не уверен, как отличить, называется ли это A() или B(). – 5122014009

ответ

0

Если вы хотите найти аннотации для одного метода, вы можете сначала получить метод с использованием отражения и сделать getDeclaredAnnotations(). Что-то вроде

Class clazz = ...//obtain class object Method method = clazz.getMethod("A", null);

В качестве альтернативы, с текущим кодом, вы можете перебрать все методы и сделать сопоставление для имени методы, делая m.getName() внутри for цикла, чтобы выяснить, какой метод вы смотрите прямо сейчас.

PS: Я не совсем уверен, что ваш код будет компилировать (MyAnnoProcessor, я не вижу никаких методов) и, пожалуйста, попробуйте следовать именования для методов)

+0

Спасибо. Я хочу обработчик аннотации, который просто вернет экземпляр объекта на основе значения, переданного «name» в аннотированном методе. То есть @MyAnno (name = "Person") public void doSthWithperson() {// и экземпляр Person становится доступным здесь через обработчик аннотации} или @MyAnno (name = "Employee") public void doSthWithEmployee() {// и Экземпляр сотрудника доступен для обработчика аннотации}. Можно ли это сделать без передачи аннотированного метода явно обработчику аннотаций? – 5122014009

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