java tutorial - Руководство Java Annotation - учебник java - java programming - учиться java - java basics - java for beginners




1- Что такое Annotation и цель использования

  • Annotation (Аннотация) используется для предоставления метаданных для вашего Java кода. Как метаданные, Annotation не влияют напрямую на выполнение ваших кодов, несмотря на то, что некоторые аннотации могут быть реально использованы с той целью. Annotation добавлен в Java, начиная с Java 5
  • Annotation используются с целью
    • Инструкция для компилятора (Compiler)
    • Инструкция во время построения (Build-time)
    • Инструкция во время запуска (Runtime)

1.1- Инструкция для компилятора

  • Java имеет 3 Annotation, которые вы можете использовать для предоставления инструкций для компилятора Java.
    • @Deprecated
    • @Override
    • @SuppressWarnings
  • Эти Annotation объяснены более детально в данной статье.

1.2- Интструкция по времени построения (Build-time)

  • Annotation может быть использован во время построения (Build-time), когда вы строите ваш проект программного обеспечения. Процесс построения включает создание исходных кодов, компиляции исходных кодов создание файлов XML (например дескрипторы развертывания), упаковка скомпилированного кода и файлов в один файл JAR, и т.д. Построение программного обеспечения обычно выполняется автоматическим инструментом строения как Apache Ant или Apache Maven . Строение инструментов, которые могут сканировать ваш код Java и в зависимости от ваших аннотаций (Annotation) создать исходный код или другие файлы на основании этих аннотаций.

1.3- Инструкция по времени запуска (Runtime)

  • Обчычно, Annotation не присутствуют в вашем коде Java после компиляции. Но можно определить ваши Annotation во время запуска. Эти аннотации потом могут быть доступны через Java Reflection, и использоваться для инструкции ваших программ, или API третьей стороны (Third party API).
  • Имеются 3 важных Annotation в Java
    • @Deprecated
    • @Override
    • @SuppressWarnings

2.1- @Deprecated

  • Это Annotation использующийся для аннотации чего-то устаревшего, как класс или метод, который не стоит больше использовать.
  • Аннотация @Deprecated компилятор интересуется, чтобы оповестить вас об альтернативе. Или с программированием IDE, например Eclipse так же показывает вам визуальные оповещения.

DeprecatedMethodDemo.java

package org.wikitechy.tutorial.ann.builtin;
 
import java.util.Date;
 
public class DeprecatedMethodDemo {
 
  /**
   * @deprecated replaced by {@link #todo(String,Date)}
   */
  @Deprecated
  public void todoJob(String jobName) {
      System.out.println("Todo " + jobName);
  }
 
  public void todo(String jobName, Date atTime) {
      System.out.println("Todo " + jobName + " at " + atTime);
  }
 
  public void todoNothing() {
      System.out.println("Todo Nothing");
  }
 
  public static void main(String[] args) {
 
      DeprecatedMethodDemo obj = new DeprecatedMethodDemo();
 
      obj.todoJob("Java coding");
 
      obj.todoNothing();
  }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • В следующей иллюстрации Eclipse оповещает вас:
 нерекомендуемый метод демо java
java - джава - учиться java - учебник java -
нерекомендуемый метод демо java
- примеры java - java-программы

2.2- @Override

  • Annotation @Override используется для методов, которые переопределяют метод в суперклассе (superclass). Если данный метод не соответствует методу в суперклассе, компилятор оповестит вас об ошибке.
  • Annotation @Override не обязателен чтобы переопределить метод суперкласса. Все же это хорошая идея для использования. В случае, если кто-то изменил название метода супекласса, метод в вашем классе больше не будет переопределенным методом. При отсутствии аннотации @Override вы не найдете. С аннотациями @Override компилятор оповестит вас о том, что методы подкласса не переопределяют методы в суперклассе.
  • Смотрите пример:

Job.java

package org.wikitechy.tutorial.ann.builtin;
 
public class Job {
 
    // Это метод класса Job.
    public String getName() {
        return null;
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

JavaCoding.java

package org.wikitechy.tutorial.ann.builtin;
 
public class JavaCoding extends Job {
 
    // Это метод, который переопределяет метод getName() родительского класса.
    // @Override не обязан быть прикрепленным к этому методу.
    // Но необходим если кто-то менят название метода getName()
    // родительского класса, для вас будет оповещение об ошибке.
    @Override
    public String getName() {
        return "Java Coding";
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

И это оповещение Java Compiler:

 Имя задания метода
java - джава - учиться java - учебник java -
Имя задания метода
- примеры java - java-программы

2.3- @SuppressWarnings

  • Аннотация @SuppressWarnings заставляет компилятор останавливать предупреждения определенного метода. Например, метод вызывает устаревший метод, или внутри метода есть небезопасный вид, компилятор может создать предупреждение. Вы можете отключить эти предупреждения аннотацией данного метода используя @SuppressWarnings.
  • Смотрите пример:

SuppressWarningsDemo.java SuppressWarningsDemo.java

package org.wikitechy.tutorial.ann.builtin;
 
import java.util.Date;
 
public class SuppressWarningsDemo {
 
  @SuppressWarnings("deprecation")
  public Date getSomeDate() {
 
      Date date = new Date(2014, 9, 25);
      return date;
  }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • Смотрите предупреждения компилятора:
 подавить предупреждение демо
java - джава - учиться java - учебник java -
подавить предупреждение демо
- примеры java - java-программы

SuppressWarningsDemo2.java

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
public class SuppressWarningsDemo2 {
 
    public List<?> getDatas() {
        List<String> list = new ArrayList<String>();
        list.add("One");
        return list;
    }
 
    @SuppressWarnings({ "deprecation", "unused", "unchecked" })
    public void processDatas() {
 
        // Вы используете устаревший конструктор
        // И переменная 'date' создана, но не используется.
        Date date = new Date(2014, 9, 25);
 
        // Сделать небезопасный cast.
        // Переменная 'datas' создана, но не используется в коде.
        List<String> datas = (List<String>) this.getDatas();
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

Предупреждения компилятора:

 подавить предупреждение демо2
java - джава - учиться java - учебник java -
подавить предупреждение демо2
- примеры java - java-программы

3- Напишите ваш Annotation

  • Используя @interface как ключевое слово объявления Annotation, annotation довольно похож на интерфейс. Annotation содержит или не содержить элементы (elements) внутри.
  • Характеристики элементов (element) annotation:
  • Нет функциональной основы
  • Нет функционального параметра
  • Возвращенное объявление должно быть определенного вида:
    • Примитивный вид (boolean, int, float, ...)
    • Enum
    • Annotation
    • Class (Например: String.class)
  • Может иметь значение по умолчанию

3.1- Ваш первый Annotation

MyFirstAnnotation.java

package org.wikitechy.tutorial.ann1;
 
public @interface MyFirstAnnotation {
 
    // Элемент 'name'.
    public String name();
 
    // Элемент 'description', со значением по умолчанию "".
    public String description() default "";
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

Annotation может использоваться на:

  • TYPE - Прикрепленный на объявлении Class, interface, enum, annotation.
  • FIELD - Прикрепленный на объявлении поля (field), включая констанции enum.
  • METHOD - Прикрепленный на объявлении method.
  • PARAMETER - Прикрепленный на объявлении parameter
  • CONSTRUCTOR - Прикрепленный на объявлении конструктора
  • LOCAL_VARIABLE - Прикрепленный на локальной переменной.
  • ANNOTATION_TYPE - Прикрепленный на объявлении Annotation
  • PACKAGE - Прикрепленный на объявлении package.

UsingMyFirstAnnotation.java

@MyFirstAnnotation(name = "Some name", description = "Some description")
public class UsingMyFirstAnnotation {
 
    // Annotation (Аннотация) прикреплена к Constructor (Конструктору).
    // Со значением элемента name "John"
    // Значение элемента description является "Write by John".
    @MyFirstAnnotation(name = "John", description = "Write by John")
    public UsingMyFirstAnnotation() {
 
    }
 
    // Annotation được gắn trên một phương thức.
    // Со значением элемента 'name' "Tom"
    // Элемент 'description' не объявлен, он будет взят по умолчанию.
    @MyFirstAnnotation(name = "Tom")
    public void someMethod() {
 
    }
 
    // Annotation прикреплена к параметру одного метода.
    public void todo(@MyFirstAnnotation(name = "none") String job) {
 
        // Annotation прикреплена к локальной переменной.
        @MyFirstAnnotation(name = "Some name")
        int localVariable = 0;
 
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

3.2- Annotation с элементом value. (Особенный)

  • Annotation имеет элемент с названием value, который имеет особенные характеристики:

AnnWithValue.java

package org.wikitechy.tutorial.ann2;
 
public @interface AnnWithValue {
 
    // Элемент с названием 'value', Аннотации.
    // Имеет некоторую особенность при использовании данного элемента.
    public int value();
 
    // Элемент 'name'
    public String name() default "";
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

UsingAnnWithValue.java

package org.wikitechy.tutorial.ann2;
 
public class UsingAnnWithValue {
 
    // Генерировать элементы Аннотации обычным способом.
    @AnnWithValue(name = "Name1", value = 100)
    public void someMethod1() {
 
    }
 
    // Генерировать элементы Аннотации обычным способом.
    // Элемент 'name' Аннотации будет иметь значение по умолчанию
    @AnnWithValue(value = 100)
    public void someMethod2() {
 
    }
 
    // Элемент с названием 'value' является особенным.
    // Вместо @AnnWithValue(value = 100)
    // Вам нужно написать только @AnnWithValue(100)
    @AnnWithValue(100)
    public void someMethod3() {
 
    }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

3.3- @Retention & @Target

  • RetentionPolicy.SOURCE: Существует на исходном коде, и не узнаваем компилятором (compiler).
  • RetentionPolicy.CLASS: Компилятер разпознает существование, но не распознается виртуальной машиной при запуске (Runtime).
  • RetentionPolicyRUNTIME: достигает высшую степень существования, разпознается компилятором (compiler), и распознается существование виртуальной машиной при запуске.

@Target

  • @Target: Используется для примечания другого annotation, и в каких сферах тот annotation будет использоваться.
  • ElementType.TYPE - Прикреплен на объявлении Class, interface, enum, annotation.
  • ElementType.FIELD - Прикреплен на объявлении поля (field), включая константы enum.
  • ElementType.METHOD - Прикреплен на объявлении method.
  • ElementType.PARAMETER - Прикреплен на объявлении parameter
  • ElementType.CONSTRUCTOR - Прикреплен на объявлении конструктора
  • ElementType.LOCAL_VARIABLE - Прикреплен на объявлении локальной переменной.
  • ElementType.ANNOTATION_TYPE - Прикреплен на объявлении Annotation
  • ElementType.PACKAGE - Прикреплен на объявлении package.

AnnFM.java

package org.wikitechy.tutorial.ann3;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
// Данная аннотация (Annotation) говорит, что AnnFM только распознается на исходном коде.
// Он не будет распознан компилятором (compiler),
// и во время запуска виртуальной машины, так же не будет знать о его существовании.
@Retention(value = RetentionPolicy.SOURCE)
 
// Данная аннотация (Annotation) говорит:
// AnnFM будет использован только как аннотация (annotate) на FIELD или METHOD.
@Target(value = { ElementType.FIELD, ElementType.METHOD })
public @interface AnnFM {
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

UsingAnnFM.java

package org.wikitechy.tutorial.ann3;
 
public class UsingAnnFM {
 
    // AnnFM может только аннотировать (annotate) на FIELD или METHOD.
    @AnnFM
    protected int someField = 100;
 
    // AnnFM может только аннотировать (annotate) на FIELD или METHOD.
    @AnnFM
    public void someMethod() {
 
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

3.4- Annotation & Reflection

  • Java Reflection может определить такие вещи как (Class, field, method, ..) аннотированный используя некоторый Annotation. И конечно же, он распознает Annotation имеющие @Retention(RetentionPolicy.RUNTIME)
  • Пример ниже описывет программу, которая читает аннотации в файлах Java и создает файлы Html. Каждый class соответствует файлу html.
 Java пакет html
java - джава - учиться java - учебник java -
Java пакет html
- примеры java - java-программы
 Аннотация пакет
java - джава - учиться java - учебник java -
Аннотация пакет
- примеры java - java-программы

AnnHtmlUL.java

 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Retention(RetentionPolicy.RUNTIME)
 
// Данная аннотация (Annotation) говорит:
// AnnHtmlUL используется только для Class, interface, annotation, enum.
@Target(value = { ElementType.TYPE })
 
// AnnHtmlUL: Симулирует тег (tag) <UL> в HTML.
public @interface AnnHtmlUL {
 
    public String border() default "border:1px solid blue;";
     
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

AnnHtmlLI.java

package org.wikitechy.tutorial.ann4;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD, ElementType.METHOD })
 
// Симулирует тег  (tag) <LI> в HTML.
public @interface AnnHtmlLI {
 
    public String background();
 
    public String color() default "red";
     
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

DocumentClass.java

package org.wikitechy.tutorial.ann4;
 
@AnnHtmlUL(border = "1px solid red")
public class DocumentClass {
 
    private String author;
 
    @AnnHtmlLI(background = "blue", color = "black")
    public String getDocumentName() {
        return "Java Core";
    }
 
    @AnnHtmlLI(background = "yellow")
    public String getDocumentVersion() {
        return "1.0";
    }
 
    @AnnHtmlLI(background = "green")
    public void setAuthor(String author) {
        this.author = author;
    }
 
    @AnnHtmlLI(background = "red", color = "black")
    public String getAuthor() {
        return author;
    }
     
    // Этот метод не аннотирован никакой аннотацией (Annotation).
    public float getPrice()  {
        return 100;
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

HtmlGenerator.java

package org.wikitechy.tutorial.ann4;
 
import java.lang.reflect.Method;
 
public class HtmlGenerator {
 
    public static void main(String[] args) {
 
        Class<?> clazz = DocumentClass.class;
 
        // Проверить аннотирован (annotate) ли класс с помощью AnnHtmlUL или нет.
        boolean isHtmlUL = clazz.isAnnotationPresent(AnnHtmlUL.class);
 
        StringBuilder sb = new StringBuilder();
        if (isHtmlUL) {
 
            // Получить объект AnnHtmlUL, аннотированный на данном классе.
            AnnHtmlUL annUL = clazz.getAnnotation(AnnHtmlUL.class);
 
            sb.append("<H3>" + clazz.getName() + "</H3>");
            sb.append("\n");
 
            // Получить значение элемента 'border' в AnnHtmlUL.
            String border = annUL.border();
 
            sb.append("<UL style='border:" + border + "'>");
 
            // Добавить новую строку.
            sb.append("\n");
 
            Method[] methods = clazz.getMethods();
 
            for (Method method : methods) {
                // Проверить аннотирован (annotate) ли данный метод с помощью AnnHtmlLI или нет?
                if (method.isAnnotationPresent(AnnHtmlLI.class)) {
                    // Получить ту аннотацию (annotation).
                    AnnHtmlLI annLI = method.getAnnotation(AnnHtmlLI.class);
 
                    // Получить значение элементов AnnHtmlLI.
                    String background = annLI.background();
                    String color = annLI.color();
 
                    sb.append("<LI style='margin:5px;padding:5px;background:" + background + ";color:" + color + "'>");
                    sb.append("\n");
                    sb.append(method.getName());
                    sb.append("\n");
                    sb.append("</LI>");
                    sb.append("\n");
                }
            }
            sb.append("</UL>");
        }
        writeToFile(clazz.getSimpleName() + ".html", sb);
    }
 
    // Записать информацию на экран Console (Или файл).
    private static void writeToFile(String fileName, StringBuilder sb) {
        System.out.println(sb);
    }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • Результаты запуска примера:
 Генератор html страниц
java - джава - учиться java - учебник java -
Генератор html страниц
- примеры java - java-программы
 Генератор класса
java - джава - учиться java - учебник java -
Генератор класса
- примеры java - java-программы

4- Annotation Processing Tool (Знания повышенного уровня)

The situation is that:

  • Вы создаете ваш Annotation и используете их в вашем приложении Java. Эти Annotation имеют правило использования данное вами. Вы хотите, чтобы компилятор Java оповещал ошибку при неправильном использовании во время компиляции. И если вы используете Eclipse чтобы написать код, Eclipse оповещает об ошибке прямо на IDE.
  • Это вполне возможно с APT ( Annotation Processing Tool).
  • Вы можете посмотреть инструкцию APT по ссылке:

Настройте java compiler для обработки вашего Annotation (Annotation Processing Tool)

1- Введение

  • Статья основана на:
  • Eclipse 4.6 (NEON)
  • Java 7

2- Что такое Annotation Processing Tool (APT)

  • Приводится ситуация:
  • Вы создаете некоторые свои Annotation и используете их в вашем приложении Java. Эти Annotation имеют правила использования данные вами. Вы хотитте, чтобы компилятор Java (Java compiler) оповещал ошибку использования не по правилам если они возникают во время компиляции. И если вы используете Eclipse чтобы написать код, вы хотите чтобы Eclipse оповещал ошибки использования прямо на IDE.
  • Это вполне выполнимо с APT ( Annotation Processing Tool).
  • Определение APT:
  • APT (Java annotation processing tool) это инструмент, который вы можете использовать для обработки annotation на исходном коде Java. Все что вам нужно это выполнить (implements) процессор Annotation.
  • Например:
  • @PublicFinal это ваш annotation, ваше правило - он может аннотировать только на методе или поле с модификатром, являющимся публичным и финальным. Если использовать неправильно, оповещение отобразится во время компиляции, одновременно выдает оповещение на IDE:

3- Модель примера

  • Это модель примера, который я представлю в этой статье:
 apt процессор
java - джава - учиться java - учебник java -
apt процессор
- примеры java - java-программы

Ваши Annotation:

  • @PublicFinal используется только для метода или поля с модификатором (modifier), являющимися публичными и финальными (public và final).
  • @Controller использутеся только для клсса, и название класса должно иметь суффикс Controller.
  • @Action используется тоько для метода, возвращающего вид String.
  • Процессоры PublicFinalProcessor, ControllerProcessor, ActionProcesser будут выполнять задание оповещения при неправильном использовании во время компиляции, включая отображение оповещения ошибок на IDE Eclipse.

4- Project APTProcessor

  • Для начала, создадим Project.
  • APTProcessor
 apt получить процессор
java - джава - учиться java - учебник java -
apt получить процессор
- примеры java - java-программы

Action.java

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Action {
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

Controller.java

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Controller {
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

PublicFinal.java

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
 
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface PublicFinal {
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

AcctionProccessor.java

import java.util.List;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import javax.tools.Diagnostic.Kind;
 
import com.wikitechy.log.DevLog;
 
// Work with @Action
@SupportedAnnotationTypes({ "com.wikitechy.ann.Action" })
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class ActionProcessor extends AbstractProcessor {
 
  private Filer filer;
  private Messager messager;
 
  @Override
  public void init(ProcessingEnvironment env) {
      filer = env.getFiler();
      messager = env.getMessager();
  }
 
 
  @Override
  public boolean process(Set<? extends TypeElement> annotations,
          RoundEnvironment env) {
      DevLog.log("\n\n");
      DevLog.log(" ======================================================== ");
      DevLog.log("#process(...) in " + this.getClass().getSimpleName());
      DevLog.log(" ======================================================== ");
 
      for (TypeElement ann : annotations) {
          DevLog.log(" ==> TypeElement ann = " + ann);
 
          List<? extends Element> es = ann.getEnclosedElements();
          DevLog.log(" ====> ann.getEnclosedElements() count = " + es.size());
          for (Element e : es) {
              DevLog.log(" ========> EnclosedElement: " + e);
          }
          Element enclosingElement = ann.getEnclosingElement();
 
          DevLog.log(" ====> ann.getEnclosingElement() = " + enclosingElement);
 
          ElementKind kind = ann.getKind();
          DevLog.log(" ====> ann.getKind() = " + kind);
          Set<? extends Element> e2s = env.getElementsAnnotatedWith(ann);
 
          DevLog.log(" ====> env.getElementsAnnotatedWith(ann) count = "
                  + e2s.size());
          for (Element e2 : e2s) {
              DevLog.log(" ========> ElementsAnnotatedWith: " + e2);
              DevLog.log("           - Kind : " + e2.getKind());
 
 
              // @Action use for method only
              // notify if misuse
              if (e2.getKind() != ElementKind.METHOD) {
                  DevLog.log("           - Error!!!");
                  messager.printMessage(Kind.ERROR, "@Action using for method only ",
                          e2);
              } else {
 
                  // The name of the method is annotated by @Action
                  String methodName = e2.getSimpleName().toString();
 
                  // (ExecutableElement described for method, constructor,...)
                  ExecutableElement method = (ExecutableElement) e2;
 
                  DevLog.log("           - method : " + method);
                  TypeMirror retType = method.getReturnType();
                  DevLog.log("           -- method.getReturnType() : "
                          + retType);
 
 
                  // @Action Only used for method returns the String
                  // Notify if misuse
                  if (!String.class.getName().equals(retType.toString())) {
                      DevLog.log("           - Error!!!");
                      messager.printMessage(Kind.ERROR,
                              "Method using @Action must return String", e2);
                  }
              }
          }
      }
      return true;
  }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

ControllProcessor.java

package com.wikitechy.aptprocessor;
 
import java.util.List;
import java.util.Set;
 
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
 
import com.wikitechy.log.DevLog;
 
 
// Apply for @Controller
@SupportedAnnotationTypes({ "com.wikitechy.ann.Controller" })
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class ControllerProcessor extends AbstractProcessor {
 
  private Filer filer;
  private Messager messager;
 
  @Override
  public void init(ProcessingEnvironment env) {
      filer = env.getFiler();
      messager = env.getMessager();
  }
 
 
  @Override
  public boolean process(Set<? extends TypeElement> annotations,
          RoundEnvironment env) {
      DevLog.log("\n\n");
      DevLog.log(" ======================================================== ");
      DevLog.log("#process(...) in " + this.getClass().getSimpleName());
      DevLog.log(" ======================================================== ");
 
      for (TypeElement ann : annotations) {
          DevLog.log(" ==> TypeElement ann = " + ann);
          //
          List<? extends Element> es = ann.getEnclosedElements();
          DevLog.log(" ====> ann.getEnclosedElements() count = " + es.size());
          for (Element e : es) {
              DevLog.log(" ========> EnclosedElement: " + e);
          }
          Element enclosingElement = ann.getEnclosingElement();
 
          DevLog.log(" ====> ann.getEnclosingElement() = " + enclosingElement);
 
          ElementKind kind = ann.getKind();
          DevLog.log(" ====> ann.getKind() = " + kind);
          Set<? extends Element> e2s = env.getElementsAnnotatedWith(ann);
 
          DevLog.log(" ====> env.getElementsAnnotatedWith(ann) count = "
                  + e2s.size());
          for (Element e2 : e2s) {
              DevLog.log(" ========> ElementsAnnotatedWith: " + e2);
              DevLog.log("           - Kind : " + e2.getKind());
 
 
              // @Controller only use for Class
              // Notify if misuse
              if (e2.getKind() != ElementKind.CLASS) {
                  DevLog.log("           - Error!!!");
                  messager.printMessage(Kind.ERROR,
                          "@Controller using for class only ", e2);
              } else {
 
                  // The name of the class is annotated by @Controller
                  String className = e2.getSimpleName().toString();
 
                  // @Controller using for class with suffix Controller
                  // Notify if misuse
                  if (!className.endsWith("Controller")) {
                      DevLog.log("           - Error!!!");
                      messager.printMessage(
                              Kind.ERROR,
                              "Class using @Controller must have suffix Controller",
                              e2);
                  }
              }
          }
 
      }
 
 
      return true;
  }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

PublicFinalProcessor.java

package com.wikitechy.aptprocessor;
 
import java.util.Set;
 
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
 
import com.wikitechy.log.DevLog;
 
 
// Apply for @PublicFinal
@SupportedAnnotationTypes(value = { "com.wikitechy.ann.PublicFinal" })
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class PublicFinalProcessor extends AbstractProcessor {
 
  private Filer filer;
  private Messager messager;
 
  @Override
  public void init(ProcessingEnvironment env) {
      filer = env.getFiler();
      messager = env.getMessager();
  }
 
  @Override
  public boolean process(Set<? extends TypeElement> annotations,
          RoundEnvironment env) {
      DevLog.log("\n\n");
      DevLog.log(" ======================================================== ");
      DevLog.log("#process(...) in " + this.getClass().getSimpleName());
      DevLog.log(" ======================================================== ");
 
      DevLog.log(" annotations count = " + annotations.size());
 
      for (TypeElement ann : annotations) {
 
          Set<? extends Element> e2s = env.getElementsAnnotatedWith(ann);
          for (Element e2 : e2s) {
              DevLog.log("- e2 = " + e2);
 
              Set<Modifier> modifiers = e2.getModifiers();
 
              // @PublicFinal only using for public & final
              // Notify if misuse
              if (!(modifiers.contains(Modifier.FINAL) && modifiers
                      .contains(Modifier.PUBLIC))) {
                  DevLog.log("- Error!!!");
                  messager.printMessage(Kind.ERROR,
                          "Method/field wasn't public and final", e2);
 
              }
          }
      }
 
      // All PublicFinal annotations are handled by this Processor.
      return true;
  }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

DevLog.java

package com.wikitechy.log;
 
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
 
public class DevLog {
 
 public static final String LOG_FILE = "C:/APT/log.txt";
 
 public static void log(Object message) {
     if (message == null) {
         return;
     }
    
     // Make sure the path exists.
     new File(LOG_FILE).getParentFile().mkdirs();
     //
     FileWriter writer = null;
     try {
         writer = new FileWriter(LOG_FILE, true);
         writer.append(message.toString());
         writer.append("\n");
         writer.close();
     } catch (IOException e) {
         e.printStackTrace();
         try {
             writer.close();
         } catch (IOException e1) {
         }
     }
 }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

Declare Service

 метаданных apt процессора
java - джава - учиться java - учебник java -
метаданных apt процессора
- примеры java - java-программы

Упаковка project APTProcessor в file jar:

  • Нажмите на правую кнопку мыши на Project и выберите Export:
 экспорт java
java - джава - учиться java - учебник java -
экспорт java
- примеры java - java-программы
 jarfile экспорт java
java - джава - учиться java - учебник java -
jarfile экспорт java
- примеры java - java-программы
 jar файла specificati
java - джава - учиться java - учебник java -
jar файла specificati
- примеры java - java-программы
 вариант упаковки jar
java - джава - учиться java - учебник java -
вариант упаковки jar
- примеры java - java-программы
 банку манифеста спецификация
java - джава - учиться java - учебник java -
банку манифеста спецификация
- примеры java - java-программы

Export успешно:

 aptp процессор
java - джава - учиться java - учебник java -
aptp процессор
- примеры java - java-программы

5- Project APTTutorial

  • Создать Project APTTutorial:
 aptp учебник
java - джава - учиться java - учебник java -
aptp учебник
- примеры java - java-программы
  • Нажать на правую кнопку мыши на APTTutorial и выбрать properties.Объявить использование библиотеки APTProccessor который вы создали до этого.
 свойства aptp учебник
java - джава - учиться java - учебник java -
свойства aptp учебник
- примеры java - java-программы
  • Объявить использование вашего Annotation Processor c Compiler.
 Аннотация propertites
java - джава - учиться java - учебник java -
Аннотация propertites
- примеры java - java-программы
 Продаю aptt учебник
java - джава - учиться java - учебник java -
Продаю aptt учебник
- примеры java - java-программы
  • Объявить местоположение библиотеки Processor:
 путь заводе
java - джава - учиться java - учебник java -
путь заводе
- примеры java - java-программы
  • Вы можете нажать на Advanced.. чтобы увидеть какой Processor уже зарегистрирован с Compiler
 путь заводе расширенный
java - джава - учиться java - учебник java -
путь заводе расширенный
- примеры java - java-программы
  • Нажмите на OK чтобы завершить:
 свойств фабрика путь расширенный
java - джава - учиться java - учебник java -
свойств фабрика путь расширенный
- примеры java - java-программы
 Параметры обработки аннотаций
java - джава - учиться java - учебник java -
Параметры обработки аннотаций
- примеры java - java-программы
  • Создать некоторые классы test используя ваши Annotation и Processor:
 АПТВ учебного пакета обозревателя
java - джава - учиться java - учебник java -
АПТВ учебного пакета обозревателя
- примеры java - java-программы

PublicFinalTest.java

package org.wikitechy.tutorial.apttest;
 
import com.wikitechy.ann.PublicFinal;
 
public class PublicFinalTest {
 
  @PublicFinal
  public final static int ABC = 100;
 
  @PublicFinal
  private static String MODULE_NAME = "APT";  
  
  
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
  • Оповещение ошибки отображенное на IDE:
 Заключительный тест java
java - джава - учиться java - учебник java -
Заключительный тест java
- примеры java - java-программы

TestActionController_01.java

package org.wikitechy.tutorial.apttest;
 
import com.wikitechy.ann.Action;
import com.wikitechy.ann.Controller;
 
@Controller
public class TestActionController_01 {
 
  @Action
  public String exit() {
      return null;
  }
 
  @Action
  public void print() {
 
  }
 
  @Action
  public int error() {
      return 0;
  }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
 Тестирование контроллера действий
java - джава - учиться java - учебник java -
Тестирование контроллера действий
- примеры java - java-программы

TestActionController_02.java ?

TestActionController.java

 Тестирование действий контроллера открытый класс
java - джава - учиться java - учебник java -
Тестирование действий контроллера открытый класс
- примеры java - java-программы

Related Searches to Руководство Java Annotation