Использование инспектора элементов Chrome в режиме предварительного просмотра?

Обработка аннотации неверна для вас, из 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() не предоставляет доступ к частной собственности.

Ну, теперь кажется, что на ваш вопрос ответили, но если я пропустил что-либо, или вы получите дополнительный вопрос / проблемы таким образом - не стесняйтесь спрашивать ;)

620
задан Flimm 19 January 2017 в 09:51
поделиться