Java аннотация динамическая типизация - PullRequest
5 голосов
/ 29 апреля 2011

У меня есть 2 типа Java-аннотаций, скажем, XA и YA.У обоих есть метод ().Я анализирую исходный код и получаю объект аннотации.Теперь я хотел бы динамически привести аннотацию к реальному типу, чтобы можно было вызывать метод ().Как я могу сделать это без оператора instanceof?Я действительно хочу избежать переключения, как источник.Мне нужно что-то вроде этого:

Annotation annotation = getAnnotation(); // I recieve the Annotation object here
String annotationType = annotation.annotationType().getName();

?_? myAnnotation = (Class.forName(annotationType)) annotation;
annotation.method(); // this is what I need, get the method() called

? _?означает, что я понятия не имею, что будет тип myAnnotation.Я не могу использовать базовый класс для своих аннотаций XA и YA, поскольку наследование в аннотациях не допускается.Или это можно как-то сделать?

Спасибо за любое предложение или помощь.

Ответы [ 2 ]

6 голосов
/ 29 апреля 2011

Почему вы не используете типобезопасный способ получения аннотации?

final YourAnnotationType annotation = classType.getAnnotation(YourAnnotationType.class);
annotation.yourMethod();

Если ваша аннотация не может быть найдена, возвращается ноль.

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

5 голосов
/ 29 апреля 2011

Один из способов - динамический вызов метода с использованием его имени:

Annotation annotation = getAnnotation();
Class<? extends Annotation> annotationType = annotation.annotationType();
Object result = annotationType.getMethod("method").invoke(annotation);

Этот подход довольно рискованный и полностью скомпрометирует рефакторинг кода при необходимости.

...