fork download
  1. import java.lang.annotation.*;
  2.  
  3. enum NoType {;}
  4.  
  5. @Retention(RetentionPolicy.RUNTIME)
  6. @Target(ElementType.METHOD)
  7. @interface A {
  8. Class<?> data() default NoType.class; // field from B
  9. int dataA() default 0; // field from C
  10. String dataB() default ""; // field from C
  11. }
  12.  
  13. @Retention(RetentionPolicy.RUNTIME)
  14. @Target(ElementType.METHOD)
  15. @interface D {
  16. A[] value() default {};
  17. }
  18.  
  19. class Foo {}
  20. class Bar {}
  21.  
  22. class Example {
  23. @D({
  24. @A(data = Bar.class),
  25. @A(dataA = 5, dataB = "Bla"),
  26. @A(data = Foo.class)
  27. })
  28. public static void main(String[] args) throws Exception {
  29. for (A a : Example.class.getMethod("main", String[].class)
  30. .getAnnotation(D.class).value()) {
  31. if (a.data() != NoType.class) {
  32. System.out.printf("B(%s)%n", a.data());
  33. } else {
  34. System.out.printf("C(dataA = %d, dataB = \"%s\")%n",
  35. a.dataA(), a.dataB());
  36. }
  37. }
  38. }
  39. }
Success #stdin #stdout 0.14s 29452KB
stdin
Standard input is empty
stdout
B(class Bar)
C(dataA = 5, dataB = "Bla")
B(class Foo)