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.
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}