Как создать метод для аннотированного класса? - PullRequest
2 голосов
/ 23 июня 2011

Я хочу учиться и веселиться с аннотациями. Вот мой пример использования: у меня есть куча классов, которые в основном играют одинаковую роль: проверяют URL видео на соответствие регулярному выражению (1 метод) и возвращают соответствующий встроенный HTML (другой метод).

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

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.??)
@Inherited
@Documented
public @interface VideoProvider {
        String regex();
        int group() default 1;
}

Обработано так:

//processor class
public boolean process(Set<? extends TypeElement> annotations,
        RoundEnvironment roundEnv) {
    for (TypeElement annotation : annotations) {
        for (Element e :    roundEnv.getElementsAnnotatedWith(annotation)) {
            if (e.getKind().isClass()) {
                //?????
            }
        }
    }
    return false;
}

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

Заранее спасибо!

Rolf

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Посмотрите, как использовать java Proxy класс, который вы используете cglib Enhancer class. Оба решения позволяют вам прокси-класс и использовать любой метод.

0 голосов
/ 23 июня 2011

Я думаю, что вы делаете это неправильно ---

Но если вы действительно хотите реализовать это с помощью обработки аннотаций во время компиляции, вам стоит взглянуть на API-интерфейс обработки сменных аннотаций

Это специально для добавления расширений на основе аннотаций в процесс компиляции, для таких вещей, как автоматическое добавление методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...