Annotations

sebastianb

Erfahrenes Mitglied
hi Zusammen,

leider habe ich gerade ein seltsames Problem mit zwei eigenen Annotations

Java:
import static de.hfu.brauns.thesis.testumgebung.commons.annotations.SetterInformation.DEFAULT_SETTER_NAME;
import static de.hfu.brauns.thesis.testumgebung.commons.annotations.SetterInformation.DEFAULT_SETTER_TYPE;

@Target(java.lang.annotation.ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ForceLazyInitialization
{

   SetterInformation setterInformation() default @SetterInformation(setterName = DEFAULT_SETTER_NAME, setterType = DEFAULT_SETTER_TYPE);

}
Java:
@Target(METHOD)
@Retention(RUNTIME)
public @interface SetterInformation
{
   public final static String DEFAULT_SETTER_NAME = "DEF";

   public final static Class<?> DEFAULT_SETTER_TYPE = void.class;

   public String setterName();

   public Class<?> setterType();

}

leider zeigt Mir Eclipse nun in der Annotation "ForceLazyInitialization ein Fehler bei "setterType = DEFAULT_SETTER_TYPE" an => "The value for annotation attribute SetterInformation.setterType must be a class literal". Gebe ich jedoch direkt "void.class" an und nicht das statisch Feld an funktioniert es. Das andere statische Feld nimmt er aber ohne Probleme.
Der Grund warum ich das Ganze auf zwei Annotations aufteile liegt daran, dass entweder gar kein Wert oder beide (SetterName und SetterType) gesetzt werden müssen:
Java:
@ForceLazyInitialization(setterInformation=@SetterInformation(setterName="SetName",setterType=String.class))
//oder so:
@ForceLazyInitialization()

Gruß S.
 
Hallo,

AFAIK kann man zwei Annoation Werte nicht direkt voneinander abhängig machen. Die Prüfung müsstest du selber entweder zur Compiler-Time mit einem Annoation Prozessor wie APT machen (siehe auch: http://www.tutorials.de/java/367287...n-und-anzeigen-mit-annotation-processors.html) oder zur Laufzeit über Reflection.
Außerdem:
setterType -> ist das der Parameter-Typ der Single-Argument set-Methode oder der rückgabewert (da default void...)

Ich fände es besser anstatt von settern - von Properties zu sprechen (das wäre IMHO allgemeiner).
Ansonsten würde mich mal interessieren was du genau machen möchtest. Sieht so aus als würdes du im Kontext von O/R Mappern die Lazy-Loading Proxies an entsprechenden Punkten deiner Anwendung implizit initialisieren...

Gruß Tom
 
hi,

danke für die hinweise.
Das Ganze ist ein Teil meiner Thesis die sich rund um JPA mit Hibernate sowie um Unterpunkte wie Locking, Merging und eben auch Lazyloading dreht.
Mein Vorgehen zu Lazyloading ist folgende:
Wird ein getter aufgerufen, der mit @ForceLazyInitialitation annotiert ist, springt ein Aspekt an, der zunächst das eigentlich Objekt holt und überpüft ob zB die Collection initalisiert ist. Falls das nicht der Fall ist wird eine Anfrage an den Server geschickt der die Collection initalisiert. Nachdem der Apspekt die initalierte Collection bekommen hat, ruft er (über Reflection) den korrespondieren Setter auf und setzt die Collection, so dass bei einem späteren Aufruf diese nicht nochmal initalisiert werden muss. Danach gibt der Aspekt die Collection an den eigentlich Aufrufer zurück und alle sind glücklick =)
Der Grund warum ich die Annotation nun erweitern wollte ist, dass es bei uns Fälle gibt, wo der Setter anderst heißt wie der Getter zB getProjects und setInternalProjects. In diesem Fall wäre es dem Aspekt nicht möglich die initalisierte Collection zu setzen.

Gruß Sebastian
 
Zurück