Как вызвать метод из ссылки отправить в аннотацию в Java - PullRequest
0 голосов
/ 07 октября 2018

У меня есть интерфейс I и абстрактный класс A , у меня есть Моя пользовательская аннотация MyAnnotation , которая должна принимать параметр в качестве подкласса S из A , теперь при обработке аннотации я хочу вызвать метод конкретного класса S

public interface I{
   void m1();
}

public abstract class A implements I {
    public abstract void m1();
}

public @interface MyAnnotation {
    public Class< ? extends A> ref();
    public Class< ? super A> ref2();
}

public S extends A{
    public void m1() {}
}

Я аннотирую метод как

@MyAnnotation(ref= new XX() )  or @MyAnnotation(ref= XX.class )
@MyAnnotation(ref= new yy() ) or @MyAnnotation(ref= yy.class )

что работает

//In spring aspect before processing I am getting method annotation and trying to call m1()  
annotation.ref().m1() //Error
annotation.ref2().m1() //Error

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Вы не можете использовать new XX() в аннотации.Параметры аннотаций могут использовать очень специфический набор типов:

  • примитив
  • String
  • Класс
  • Enum
  • другая аннотация
  • массив любого из вышеперечисленных

См. этот ответ .

Итак, чтобы выполнить то, что выпытаясь выполнить, вам нужно будет использовать класс.

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

Class<?> clazz = annotation.ref();
I instance = (I) cls.getConstructor().newInstance();
instance.m1();

См. этот ответ .

Все ваши классы должны иметь конструкторы без аргументов, иначе вы сможете создавать только некоторые экземпляры таким способом, но не другие (что приведет к условному переходу на основе класса).

0 голосов
/ 07 октября 2018

Вы не можете сделать это просто так.Сначала вам нужен экземпляр класса.Если ваш класс A является компонентом Spring's, вы можете ввести ApplicationContext и получить компонент оттуда.Затем вы можете вызвать метод.

@Autowired
private ApplicationContext context;

void test(MyAnnotation annotation) {
    A bean = context.getBean(annotation.ref());
    bean.m1();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...