Metaprogramming

metaprogramming4AnnotationProcessing

Path
pkg17metaprogramming/metaprogramming4AnnotationProcessing.java
Package
pkg17metaprogramming
Study order
4
Run
Single-file source launch
Command
java pkg17metaprogramming/metaprogramming4AnnotationProcessing.java

There is no in-browser runner. This is the file from the curriculum, unchanged.

pkg17metaprogramming/metaprogramming4AnnotationProcessing.java
1package pkg17metaprogramming;2 3/*4 * metaprogramming4AnnotationProcessing.java5 * -----------------------------------------6 * Compile-time annotation processing: generating code from annotations.7 *8 * DEFINITION:9 *   Annotation processors run during compilation (javac) and can validate10 *   annotations or generate new source files. Lombok, MapStruct, and Dagger11 *   use this mechanism.12 *13 * KEY POINTS:14 *   - Processor extends AbstractProcessor, registered via @AutoService or META-INF.15 *   - @SupportedAnnotationTypes, @SupportedSourceVersion on the processor class.16 *   - RoundEnvironment gives annotated elements each compilation round.17 *   - Runtime retention (@Retention RUNTIME) is for reflection; SOURCE/CLASS for compile-only.18 *19 * This file is conceptual. A real processor lives in pkg17metaprogramming/processor-demo/.20 */21public class metaprogramming4AnnotationProcessing {22 23    @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE)24    @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE)25    @interface GenerateBuilder {}26 27    @GenerateBuilder28    static class Person {29        String name;30        int age;31    }32 33    public static void main(String[] args) {34        System.out.println("Annotation retention policies:");35        System.out.println("  SOURCE  — compile-time only (e.g. @Override, Lombok)");36        System.out.println("  CLASS   — in bytecode, not visible at runtime");37        System.out.println("  RUNTIME — readable via reflection at runtime");38 39        System.out.println("\nCompile-time processing flow:");40        System.out.println("  1. javac finds @GenerateBuilder on Person");41        System.out.println("  2. Processor generates PersonBuilder.java");42        System.out.println("  3. javac compiles generated sources in same round");43 44        System.out.println("\nPerson has @GenerateBuilder: " +45                Person.class.isAnnotationPresent(GenerateBuilder.class));46        System.out.println("(SOURCE retention => false at runtime — expected)");47 48        System.out.println("\nRun processor demo: cd pkg17metaprogramming/processor-demo && mvn -q compile");49    }50}