Typargument einer Variablen erfragen

vertex

Mitglied
Hi,

folgendes Beispiel:
Java:
class X<T> {
}

und

Java:
X<String> x = new X<String>();

Jetzt möchte ich das Typargument der Variablen x abfragen. In dem Fall also String.

Ich habe es so bereits probiert:
Java:
ParameterizedType pt = (ParameterizedType) x; // ClassCastException
for (Type type : pt.getActualTypeArguments()) {
	System.out.println(type);
}

Es ist wichtig, dass ich es für eine Variable und nicht für ein Feld bestimmen kann.

Weiß jemand, wie?

Ciao Olli
 
Danke, ich hatte mir schon soetwas gedacht. Ich hatte bloß die Hoffnung, weil im Bytecode das als Signatur hinterlegt wurde:
Code:
    LOCALVARIABLE x LX; L1 L8 1
    // signature LX<Ljava/lang/String;>;
    // declaration: X<java.lang.String>
 
Das geht leider nicht, dennoch danke! Wen die Aufgabe interessiert:
Ich arbeite mit dem Eclipse Modeling Framework. Metamodelle werden da mit der Sprache Ecore erstellt, die ähnlich der MOF ist. Zusammengefasst sind diese Metamodelle nur Klassendiagramme. Problem ist, dass Ecore auch Generics unterstützt, und dass nach dem gleichem Prinzip wie Java. Aus den Metamodellen werden anschließend mittels Codegenerator Java-Code generiert. Jede EClass wird zur Java-Klasse und auch die Generics werden eins zu eins übernommen.
Aufgabe ist es, ein Metamodell mit Generics in ein Metamodell ohne Generics zu transformieren. Das mache ich mit Code-Specialization. Es soll dabei aber auch ein Modelltransformator generiert werden, der die Modelle (Instanzen der Metamodelle) transformieren kann.

Technisch:
Metamodell:
Java:
class X<T> {
}

Transformiertes Metamodell (via Codespecialization):
Java:
class X_Int {
}

Java:
class X_String {
}

Ich muss nun ein Modelltransformator entwickeln, der Modelle, also Instanzen von X, zu Modelle, also Instanzen von X_Int und X_String, transformiert (mein Algorithmus zum Codespecialization stellt übrigens sicher, dass T nur mit Int und String parametrisiert werden kann). Dazu müsste ich aber das Typargument von T, also Int oder String, kennen. Ergo, ich muss von einem Objekt das Typargument zur Laufzeit erfragen.

Ciao Olli
 

Zurück
Oben