Annotations "selbstgestrickt"

schnuffie

Erfahrenes Mitglied
Hallo Java 5er,

will im Code Annotations nutzen. Hab's auch geschafft, eigene Annotations zu schreiben:

Code:
public @interface Access {
  
  public Rule rule();
  
  public enum Rule {
    
    GUEST,
    USER,
    ADMIN,
    NO
    
  }
}

Jetzt kann ich die Annotation auch verwenden:

Code:
@Access(rule=Access.Rule.USER)
public class AnnotationTest {
  public static void main(String[] args) {
    AnnotationTest t = new AnnotationTest();
    t.foo();
  }
  
  @Access(rule=Access.Rule.NO)
  public void foo() {
    Annotation[] a = AnnotationTest.class.getAnnotations();
    System.out.println(Arrays.asList(a));
  }
  
}

Soweit, sogut. Wie kann ich nun die Annotations und deren Werte abfragen?
Mit dieser Abfrage erhalte ich lediglich einen leeren Array.

Wie kann ich meine Annotations später von anderen Klassen aus abfragen?
 
Dein Code ist schon fast richtig. Du musst bei deiner Annotation nur noch die Sichtbarkeit einstellen. Der Default ist Class und das bedeutet dass die Annotation zwar für den Compiler Sichtbar ist, jedoch nicht mehr für die VM zur Laufzeit.

Also füg einfach ein:
Java:
@Retention(value = RetentionPolicy.RUNTIME)
hinzu zur Annotation selbst hinzu und dein Code funktioniert.

Übrigens kann man auch defaults angeben:
Java:
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Access {

	public Rule rule() default Rule.NO;

	public enum Rule {

		GUEST, USER, ADMIN, NO

	}
}

Dann brauch man keine Rule mehr explizit angeben, und als default bliebe dann der Zugriff verwehrt:
Java:
import java.lang.annotation.Annotation;
import java.util.Arrays;

@Access(rule = Access.Rule.USER)
public class AnnotationTest {

	public static void main(String[] args) {
		AnnotationTest t = new AnnotationTest( );
		t.foo( );
	}

	@Access
	public void foo() {

		Annotation[] a = AnnotationTest.class.getAnnotations( );
		System.out.println(Arrays.asList(a));

		try {
			Annotation[] annotations = AnnotationTest.class.getMethod("foo")
					.getAnnotations( );
			System.out.println(Arrays.asList(annotations));
		}
		catch (SecurityException e) {
			e.printStackTrace( );
		}
		catch (NoSuchMethodException e) {
			e.printStackTrace( );
		}

	}

}
 
Vielen Dank zeja, genau das hab' ich gebraucht.

Jetzt hab' ich auch rausgefunden, wie ich an die Methoden-Annotations rankomme:

Code:
@Access(rule=Access.Rule.USER)
public class AnnotationTest {
  public static void main(String[] args) throws SecurityException, NoSuchMethodException {
    AnnotationTest t = new AnnotationTest();
    t.foo();
  }
  
  @Access
  public void foo() throws SecurityException, NoSuchMethodException {
    Annotation[] a = AnnotationTest.class.getAnnotations();
    System.out.println("1" + Arrays.asList(a));
    a = AnnotationTest.class.getMethod("foo", null).getAnnotations();
    System.out.println("2" + Arrays.asList(a));
  }
  
}

Ausgabe:
HTML:
1[@annotationtest.Access(rule=USER)]
2[@annotationtest.Access(rule=NO)]
 
Zurück