Auf annotierte Felder oder Methoden zugreifen

Status
Nicht offen für weitere Antworten.

deamon

Bekanntes Mitglied
Ich möchte den Wert eines mit einer bestimmten Annotation versehenen Feldes bzw. den Rückgabewert einer entsprechend annotierten Methode auslesen.

Folgendes habe ich versucht:
Code:
public class Domain{
	@Id
	private long id = 1;
	private String name;
}

Ausgelesen werden soll das mit:
Code:
import java.lang.reflect.Field;
import javax.persistence.Id;

public class Annotest{

	public static void main(String[] args)
	throws IllegalArgumentException, IllegalAccessException{
		Domain d = new Domain();
		Class c = d.getClass();
		for(Field f : c.getFields())
		{
			System.out.println("Feld: " +f);
			if(f.isAnnotationPresent(Id.class))
				System.out.println("Wert: " + f.get(d));
		}
	}
}

Bei der Ausführung gibt es keine Ausgabe und keine Fehlermeldung.

Was ist daran falsch? Wie kann ich den Inhalt eines annotierten Feldes auslesen?
 
Zuletzt bearbeitet:
hast du deine annotation mit:
@Retention(RetentionPolicy.RUNTIME)
annotiert, ansonsten ist die annotation nämlich nicht per reflection verfügbar.
 
c.getDeclairedFields() war der springende Punkt! Damit funktioniert es.

Laut Doku werden damit aber keine Annotationen von Oberklassen angegeben. Wie kann man die auslesen? Bei JPA bzw. Hibernate kann man ein privates Feld mit @Id annotieren und eine abgeleitete Klasse wird auch mit Id gespeichert. Von der Vererbung her müsste es ja mindestens "protected" sein, aber es geht auch mit "private". Wie geht das bei Hibernate?
 
Ich habe jetzt herausgefunden, wie man auf private, annotierte Felder aus Oberklassen zugreifen kann.

Code:
import javax.persistence.Id;

public class Domain{
	@Id
	private long id = 1;
	private String name;
}

Code:
public class SubDomain extends Domain{
}

Das folgende Programm liest die Felder der aktuellen Klasse aus. Wenn dort kein entsprechend annotiertes Feld gefunden wurde, wird der Vorgang mit der Oberklasse wiederholt, so lange bis es gefunden wurde, oder keine Oberklasse mehr existiert.
Code:
import java.lang.reflect.Field;
import javax.persistence.Id;

public class Annotest{

	public static void main(String[] args)
	throws IllegalArgumentException, IllegalAccessException
	{
		Domain d = new Domain();
		Object value = getAnnotatedFieldValue(d.getClass(), d, Id.class);
		System.out.println("Wert: " + value);
		
	}

	public static Object getAnnotatedFieldValue(
					Class inspectedClass, Object inspectedObject, Class annotationType)
					throws IllegalArgumentException, IllegalAccessException
	{
		Field[] fields = inspectedClass.getDeclaredFields();
		Field.setAccessible(fields, true);
		for(Field f : fields)
		{
			if(f.isAnnotationPresent(annotationType))
			{
				return f.get(inspectedObject);
			}
				
		}
		getAnnotatedFieldValue(inspectedClass.getSuperclass(), inspectedObject,
						annotationType);
		return null;
	}
}

Gibt es noch Verbesserungsvorschläge?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben