Collections Typ Variable einer generischen Collection ?

MZ3291

Aktives Mitglied
Hallo,

im Moment versuche ich über Reflection herauszufinden, ob eine Klasse ein bestimmtes Feld hat und wenn ja, um welchen Typ es sich handelt. Wenn es sich um einen generischen Typ handelt, möchte ich wissen, von welchem Typ die Typ Variable ist. Aber wie bekomme ich die TypVariable?

Hier ein Ausschnitt:
Java:
import org.apache.commons.beanutils.PropertyUtils;
Java:
Class<?> type = ...;
Object instance = type.newInstance();
Class<?> fieldType = PropertyUtils.getPropertyType(instance, fieldName);
if(isCollection(fieldType)){
	...
}
Java:
boolean isCollection(Class<?> type) {
	return Collection.class.isAssignableFrom(type);
}

Ich kann feststellen, ob es eine Collection ist, aber wie komme ich jetzt an die Klasse der TypVariable ran?
Ich hatte mal eine Lösung mit java.lang.reflect.Field, aber schaffe es nun nicht mit Class..

Danke für Hilfe und Ideen im Voraus
MZ
 
Gar nicht, da diese Information zur Laufzeit nicht mehr vorhanden ist.
Wenn die Collection etwas beinhalten würde, könnte man dieses Objekt untersuchen, klingt aber ziemlich nach Hack. Was hast du vor?
 
Ich durchsuche die Felder einer Klasse. Ich habe z.B. den String "person.id" und eine Klasse gegeben. Dann suche ich in dieser Klasse nach dem Feld person. Wenn es existiert, finde ich den Typ von Person heraus und suche darin nach id. So ungefähr läuft das.

Ich hatte das zuerst anders gelöst:
Java:
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
Java:
Class<?> type = ...;
Field field = type.getDeclaredField(fieldName);
Class<?> fieldType = field.getType();
if(isCollection(fieldType)){
    fieldType = getTypeVariable(field.getGenericType());
}
Java:
Class<?> getTypeVariable(Type type){
	ParameterizedType parameterizedFieldType = (ParameterizedType) type;
	Type[] actualTypeArguments = parameterizedFieldType.getActualTypeArguments();
	Type typeArgument = actualTypeArguments[0];
	Class<?> elementType;
	if(typeArgument instanceof Class){
		elementType = (Class<?>) typeArgument;
	}else{
		elementType = getElementType(typeArgument);
	}
	return elementType;
}
Mir ist klar, dass der Code etwas suboptimal ist und das Ergebnis ohnehin noch nich ganz hinhaut. Aber mein primäres Problem ist eigentlich, dass eine Klasse ein Feld private GenerischeKlasse<KlasseA> hat .. aber statt Klasse A bekomme ich T als elementType..
An der Stelle bin ich nicht weitergekommen.

EDIT:
Der Fall ist folgender:
Java:
public class KlasseA<T>{
   private List<T> entries;
}

public class KlasseB extends KlasseA<KlasseC>{
}

Da "entries" nicht in KlasseB gefunden wird, wird die Oberklasse zu Rate gezogen und da habe ich die Information über T nicht .. so isses ..
 
Zuletzt bearbeitet:
> Class<?> fieldType = PropertyUtils.getPropertyType(instance, fieldName);

wenn du instance + fieldName hast, dann kannst du doch auch hier zusätzlich das Field holen und getType() abfragen?

irgendwie mag das manchmal funktionieren, wobei 'KlasseB extends KlasseA<KlasseC>' eine besonders 'materialisierte' Variante gegenüber einfach nur deklarierten 'List<X>'-Variablen ist,
allgemein solltest du aber einfach davon ausgehen, dass diese Information nicht verfügbar ist

nicht akzeptabel?
 
Ah herzlichsten Dank! Dass ich nicht selber drauf gekommen bin.
Falls es jemanden interessieren sollte, habe ich hier nochmal meinen Code in finaler Version (zumind. was dieses Codestück anbelangt):

Java:
Object instance = type.newInstance();
Class<?> fieldType = PropertyUtils.getPropertyType(instance, fieldName);
if (fieldType == null) {
	...
} else if(isCollection(fieldType)){
	Field field = type.getDeclaredField(fieldName);
	fieldType = getElementType(field.getGenericType());
}

Da kann ich mich ja jetzt meinen restlichen Problemen widmen. 🙂
 

Zurück
Oben