Обработка аннотаций - неправильный путь для вас, из Википедия :
Когда исходный код Java скомпилирован,
аннотации могут быть обработаны
плагины компилятора, называемые аннотацией
процессоры. Процессоры могут производить
информационные сообщения или создать
дополнительные исходные файлы Java или
ресурсы, которые в свою очередь могут быть
составлено и обработано, но аннотация
процессоры не могут изменять аннотированный
сам код.
Люди предложили вам правильный путь - АОП. В частности, вы можете использовать AspectJ. Способ «быстрого результата» (если вы используете Eclipse):
1) Установить AJDT (Инструменты разработки AspectJ)
2) Создайте проект AspectJ и добавьте туда свои классы и аннотации
3) Создать аспект:
public aspect Processor {
private StaticReference z;
pointcut generic()
// intercept execution of method named test, annotated with @Anno1
// from any class type, annotated with @Anno2
: execution(@Anno2 * (@Anno1 *).test())
// method takes no arguments
&& args ();
// here you have write what you want method actually does
void around () : generic() {
z.invokeToAll();
}
}
теперь вы можете выполнить тест, и вы увидите, что он работает;) AJDT автоматически компилирует для вас код, поэтому вам не нужно выполнять какую-либо ручную работу, надеюсь, это то, что вы назвали "магией";)
UPDATE:
если ваш код в методе test () зависит от значения аннотации Anno1, то внутри аспекта вы можете получить аннотацию класса, для которой он выполняется следующим образом:
void around () : generic() {
Annotation[] classAnnotations = thisJoinPoint.getThis().getClass().getAnnotations();
String ArgumentValue = null;
for ( Annotation annotation : classAnnotations ) {
if ( annotation instanceof Anno1 ) {
ArgumentValue = ((Anno1) annotation).Argument();
break;
}
}
if ( ArgumentValue != null && ArgumentValue.equals("Option1")) {
z.invokeToAll();
}
}
где thisJoinPoint - специальная ссылочная переменная.
UPDATE2:
Если вы хотите добавить System.out.println( this )
в своем аспекте, вам нужно написать туда System.out.println( thisJoinPoint.getThis() )
, только что протестировано, и оно работает. thisJoinPoint.getThis()
возвращает вам «это», но не совсем; на самом деле это переменная объекта, и если вы хотите получить какую-либо собственность, вам нужно либо привести в действие, либо использовать отражение. И thisJoinPoint.getThis()
не предоставляет доступа к частной собственности.
Что ж, теперь кажется, что на ваш вопрос ответили, но если я что-то пропустил, или у вас возникли дополнительные вопросы / проблемы с этим - не стесняйтесь спрашивать;)