2014-03-02 12 views
18

In meinem Projekt verwende ich vordefinierte Anmerkung @With:Wie kann Java-Annotation erweitert werden?

@With(Secure.class) 
public class Test { //.... 

Der Quellcode von @With:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface With { 

    Class<?>[] value() default {}; 
} 

I @Secure benutzerdefinierte Anmerkung zu schreiben, die automatisch Secure.class-@With Anmerkung platzieren wird. Wie geht das?


Was ist, wenn mir das gefällt? Wird es funktionieren?

@With(Secure.class) 
@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Secure { 

} 

Antwort

11

Von Java-Sprachspezifikation, Chapter 9.6 Annotation Types:

Keine Klausel erstreckt, ist zulässig. (Annotationstypen erweitern implizit annotation.Annotation.)

So können Sie eine Anmerkung nicht erweitern. Sie müssen einen anderen Mechanismus verwenden oder einen Code erstellen, der Ihre eigene Anmerkung erkennt und verarbeitet. Mit Spring können Sie die Anmerkungen anderer Spring-Elemente in eigenen benutzerdefinierten Annotationen gruppieren. aber immer noch keine Verlängerung.

+0

Wahrscheinlich "erweitern" ist nicht der beste Ausdruck dafür. Ich meine die Implementierung der automatischen Platzierung für das Argument. – bvitaliyg

+0

@bvitaliyg: Sie können Ihre eigenen Annotationen mit beliebigen Standardfeldern erstellen, aber in jvm gibt es keinen Out-of-the-Box-Mechanismus, der sie automatisch erkennt. Sie müssen diesen Code selbst schreiben oder prüfen, ob vorhandene Bibliotheken (wie der Frühling) für Ihren Fall ausreichen. – piotrek

+0

Es ist kein Spring-Framework. – bvitaliyg

9

Wie piotrek darauf hingewiesen hat, können Sie Annotationen nicht im Sinne von Vererbung erweitern. Dennoch können Sie Anmerkungen erstellen, die andere aggregieren:

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.TYPE}) 
public @interface SuperAnnotation { 
    String value(); 
} 

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.TYPE}) 
public @interface SubAnnotation { 
    SuperAnnotation superAnnotation(); 
    String subValue(); 
} 

Verbrauch:

@SubAnnotation(subValue = "...", superAnnotation = @SuperAnnotation(value = "superValue")) 
class someClass { ... } 
0

Wie wäre es macht eine Secure Annotation mit einem Standard-value()?

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface Secure { 

    Class<?>[] value() default { Secure.class }; 
} 
0
@With(Secure.class) 
@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Secure { 

} 

Dies funktioniert.

+0

Dies wird buchstäblich direkt von der Frage kopiert. – mkobit

+0

@mkobit Gut entdeckt. Da der Fragesteller gefragt hat, ob dies in ihrer Frage funktionieren würde, wird meine Antwort direkt auf den Punkt gebracht und beantwortet die Frage tatsächlich. –

0

Um answer--

@With(Secure.class) 
@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Secure { 

} 

Dies gilt nicht Arbeit standardmäßig Muhammad Abdurrahman des erweitern, aber sie es AnnotationUtils in Verbindung mit Spring verwenden können.

Siehe this SO answer für ein Beispiel.

Verwandte Themen