Обработка аннотации неверна для вас, из Wikipedia :
Когда исходный код Java скомпилирован, аннотации могут обрабатываться подключаемыми модулями компилятора обработчики аннотаций. Процессоры могут создавать информационные сообщения или создавать дополнительные исходные файлы или ресурсы Java, которые, в свою очередь, могут быть скомпилированы и обработаны, но обработчики аннотаций не могут изменять сам аннотированный код.
blockquote>Люди предложили вам правильный путь - АОП. В частности, вы можете использовать AspectJ. «Быстрый результат» - это (если вы используете Eclipse):
1) Установите AJDT (инструменты разработки AspectJ) 2) Создайте проект AspectJ и добавьте туда свои классы и аннотации 3) Create Aspect:
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 автоматически компилирует код для вас, поэтому не нужно выполнять какую-либо ручную работу, надейтесь, что это то, что вы назвали «magic»;)
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()
возвращает вас «это», но не совсем; на самом деле это переменная Object, и если вы хотите получить какую-либо информацию, вам нужно либо бросить, либо использовать отражение. ИthisJoinPoint.getThis()
не предоставляет доступ к частной собственности.Ну, теперь кажется, что на ваш вопрос ответили, но если я пропустил что-либо, или вы получите дополнительный вопрос / проблемы таким образом - не стесняйтесь спрашивать ;)