sagen, dass ich eine Anmerkung mit einer Eigenschaft haben:Passing Annotation Eigenschaften Meta-Annotationen
@Named(name = "Steve")
private Person person
und ich möchte eine Verbindung Annotation mit mehreren Meta-Annotationen erstellen, einschließlich der, die eine Eigenschaft
nimmt@Named
@AnotherAnnotation
@YetAnotherAnnotation
public @interface CompoundAnnotation {
...
}
Gibt es eine Möglichkeit, dass ich Eigenschaften an die zusammengesetzte Annotation zu einer der Meta-Annotationen übergeben kann?
Eg, etwa wie folgt:
@CompoundAnnotation(name = "Bob")
private Person person;
, die gleichwertig ist, aber viel bequemer als
@Named(name = "Bob")
@AnotherAnnotation
@YetAnotherAnnotation
private Person person;
Dank!
PS Entschuldigung für meine schlechte Wahl einer Beispiel Annotation - ich hatte nicht die javax.inject. @ Named Annotation im Hinterkopf, nur einige willkürliche Annotation, die Eigenschaften hat.
Vielen Dank für Ihre Antworten/Kommentare.
Es scheint definitiv der Fall zu sein, dass dies nicht möglich ist. Es passiert jedoch einfach, dass es für meinen Fall-in-Punkt eine einfache Problemlösung gibt, die ich weitergeben werde, falls es jemandem hilft:
Ich arbeite mit Spring und möchte meine eigenen Annotationen erstellen, die @ haben Komponente als Meta-Annotation, also automatisch durch Komponenten-Scan erkannt. Ich wollte jedoch auch die BeanName-Eigenschaft (entsprechend der Werteigenschaft in @Component) festlegen können, damit ich benutzerdefinierte Bean-Namen haben kann.
Nun stellt sich heraus, dass die nachdenklichen Jungs von Spring es möglich gemacht haben, genau das zu tun - der AnnotationBeanNameGenerator wird die 'value' Eigenschaft der übergebenen Annotation übernehmen und diese als Bean Name verwenden (und natürlich, Standardmäßig erhält es nur übergebene Annotationen, die @Component sind oder @Component als Meta-Annotation haben. Im Nachhinein sollte dies für mich von Anfang an klar gewesen sein - so können vorhandene Annotationen mit @Component als Meta-Annotation, wie @Service und @Registry, Bean-Namen liefern.
Hoffen, dass das für jemanden nützlich ist. Ich finde es immer noch eine Schande, dass dies nicht generell möglich ist!
Ich sehe nicht, wie, es sei denn, Sie hinzufügen Anmerkungen über Byte-Code-Manipulation zum Zeitpunkt des Ladens. (Oder ein benutzerdefinierter Annotationsprozessor, nehme ich an.) Neugierig zu sehen, was alles ohne Tricks möglich ist. –
Wenn Sie hier nur laut nachdenken, wird das keine Umgehungslösung sein, wenn Sie eine Basisklasse mit AnotherAnnotation und YAA haben und die Person-Klasse das erweitert? Schau dir auch Reflections an, vielleicht bekommst du ein paar Ideen: http://code.google.com/p/reflections/ – maksimov
Bezogen auf http://stackoverflow.com/questions/1624084/why-is-not-possible- zu-erweitern-Anmerkungen-in-Java – Gray