Java Annotation Processing

5206c19df417b8876825b5561344c1a0?s=47 Exactpro
February 07, 2020

Java Annotation Processing

Java Annotation Processing (RU)

Lilia Abdullina,
Software Developer, Exactpro

Dev Meetup
7 February 2020, Kostroma

Video (RU): https://youtu.be/IXUFDrZYzt4

To learn more about Exactpro, visit our website https://exactpro.com/

Follow us on
LinkedIn https://www.linkedin.com/company/exactpro-systems-llc
Twitter https://twitter.com/exactpro
Facebook https://www.facebook.com/exactpro/
Instagram https://www.instagram.com/exactpro/

Subscribe to Exactpro Vimeo channel https://vimeo.com/exactpro
Subscribe to Exactpro YouTube channel https://www.youtube.com/c/exactprosystems

5206c19df417b8876825b5561344c1a0?s=128

Exactpro

February 07, 2020
Tweet

Transcript

  1. Build Software to Test Software exactpro.com Java Annotation Processing 7th

    February 2020 Lilia Abdullina
  2. 2 Build Software to Test Software exactpro.com Java annotations •

    Специальная форма синтетических метаданных, которая может быть добавлена в исходный код. • Используются для анализа кода, компиляции или выполнения. • Выполняют функции: ◦ предоставляют необходимую информацию для компилятора; ◦ предоставляют информацию различным инструментам для генерации другого кода, конфигураций и т. д.; ◦ могут быть использованы во время работы кода.
  3. 3 Build Software to Test Software exactpro.com Примеры создания аннотаций

    @Retention(RetentionPolicy.CLASS) @interface MyAnnotation { ... } @Target(value=ElementType.FIELD) @Retention(value= RetentionPolicy.RUNTIME) public @interface Name { String name(); String type() default "string"; }
  4. 4 Build Software to Test Software exactpro.com Где применяется Annotation

    Processing В EXACTPRO: https://github.com/Exactpro/epfast В мире: • Auto Value https://github.com/google/auto/tree/master/value • Auto Service https://github.com/google/auto • Lombok https://github.com/rzwitserloot/lombok • Spring boot • JPA, etc...
  5. 5 Build Software to Test Software exactpro.com Ограничение Annotation processing

    API можно использовать только для создания новых файлов, а не для изменения существующих!
  6. 6 Build Software to Test Software exactpro.com JPA data binding:

    annotation processing in RUNTIME @Entity public class Order { @Id @GeneratedValue Integer id; @ManyToOne Customer customer; @OneToMany Set<Item> items; BigDecimal totalCost; // standard setter/getter methods ... }
  7. 7 Build Software to Test Software exactpro.com Неудобства RUNTIME •

    Reflection занимает много времени • Генерация bytecode в runtime - слишком сложно • Нельзя создать ресурсные файлы
  8. 8 Build Software to Test Software exactpro.com Annotation processing in

    SOURCE @StaticMetamodel(Order.class) public class Order_ { public static volatile SingularAttribute<Order, Integer> id; public static volatile SingularAttribute<Order, Customer> customer; public static volatile SetAttribute<Order, Item> items; public static volatile SingularAttribute<Order, BigDecimal> totalCost; }
  9. 9 Build Software to Test Software exactpro.com Этапы обработки аннотаций

    *.java parse and enter annotation processing analyze and generate *.class generated *.java files
  10. 10 Build Software to Test Software exactpro.com Алгоритм применения Java

    annotation processing Import of javax.annotation.processing Extending of AbstractProcessor Override method process() Gather and select annotations Write method for code generation Build project Include in the project that uses annotations
  11. 11 Build Software to Test Software exactpro.com Небольшой пример 1.

    public class Cat { 2. private String breed; 3. private int id; 4. private String name; 5. 6. //… 7. 8. @ToString 9. public String getBreed() { 10. return breed; 11. } 12. @ToString 13. public String getName() { 14. return name; 15. } 16. } 1. @Retention(RetentionPolicy.SOURCE) 2. @Target(ElementType.METHOD) 3. public @interface ToString { 4. } 1. public class ToStrings { 2. 3. public static String toString(Cat cat) { 4. return cat.getName() + "," 5. + cat.getBreed(); 6. } 7. }
  12. 12 Build Software to Test Software exactpro.com Создание обработчика 1.

    @SupportedAnnotationTypes("ToString") 2. public class AnnotationProcessor extends AbstractProcessor { 3. 4. @Override 5. public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment 6. roundEnv) 7. { 8. for (TypeElement annotation : annotations) { 9. 10. Set<? extends Element> annotatedElements = 11. roundEnv.getElementsAnnotatedWith(annotation); 12. . . . 13. } 14. 15. return true; 16. } 17. }
  13. 13 Build Software to Test Software exactpro.com Отбор нужных аннотаций

    1. Set<? extends Element> annotatedElements = roundEnv.getElementsAnnotatedWith(annotation); 2. 3. Map<Boolean, List<Element>> annotatedMethods = 4. annotatedElements.stream().collect(Collectors.partitioningBy(element -> 5. element.getSimpleName().toString().startsWith("get"))); 6. 7. List<Element> getters = annotatedMethods.get(true); 8. List<Element> otherMethods = annotatedMethods.get(false); 9. . . . 10. writeBuilderFile(className, stringGetters); 11. . . . 12. } 13. return true;
  14. 14 Build Software to Test Software exactpro.com ProcessingEnvironment • Elements:

    для работы с классами элементов; • Types: для работы с типами; • Filer: для создания нового исходного файла, класса или вспомогательных файлов; • Messager: для вывода сообщений об ошибках;
  15. 15 Build Software to Test Software exactpro.com Обработка ошибок Пример:

    otherMethods.forEach(element -> processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "@ToString must be applied to a getXxx method", element)); Результат: interface Messager void printMessage(Diagnostic.Kind kind, CharSequence msg, …);
  16. 16 Build Software to Test Software exactpro.com 1. JavaFileObject builderFile

    = processingEnv.getFiler().createSourceFile(“ToStrings”); 2. try (PrintWriter out = new PrintWriter(builderFile.openWriter())) { 3. . . . 4. out.print("public class "); 5. . . . 6. } Результат: Генерация нового .java файла interface Filer Пример:
  17. 17 Build Software to Test Software exactpro.com Завершение META-INF/services/javax.annotation.processing.Processor: AnnotationProcessor

    или 1. <dependency> 2. <groupId>com.google.auto.service</groupId> 3. <artifactId>auto-service</artifactId> 4. <version>1.0-rc4</version> 5. </dependency> 1. ... 2. @AutoService(Processor.class) 3. public class AnnotationProcessor extends 4. AbstractProcessor { 5. ...
  18. 18 Build Software to Test Software exactpro.com Результат 1. public

    class Main { 2. public static void main(String[] args){ 3. Cat cat = new Cat(); 4. cat.setName("Cat"); 5. cat.setBreed("Breed"); 6. System.out.println(ToStrings.toString(cat)); 7. } 8. }
  19. 19 Build Software to Test Software exactpro.com Тестирование обработчика аннотаций

    Google Compile Testing - github.com/google/compile-testing
  20. 20 Build Software to Test Software exactpro.com Исходный код https://github.com/lily-ab/annotationproc

  21. 21 Build Software to Test Software exactpro.com Спасибо за внимание!