2017-02-16 3 views
1

Wenn ich eine Klasse wie so haben:Erste Rückkehr der Methode typisiert mit Java Reflexion

class Test { 
    Thing<String> getThing(String thing) {} 
} 

wie kann ich feststellen, String.class auf einer Instanz von Test-Reflexion verwendet? Der Pfad, den ich nehmen möchte, ist neu Test() -> get class -> Finde Methode -> return type -> -> bekomme irgendwie String.class, aber ich finde nicht, wie der letzte Teil gemacht wird. Was ich bisher habe, bringt mich Thing<java.lang.String> aber nicht die innere Klasse.

import org.reflections.ReflectionUtils; 

Iterables.getOnlyElement(ReflectionUtils.getAllMethods((new Test()).getClass())).getGenericType(); 

während .getReturnType() nur bekommt mir ein Thing.class ...

+1

[Typ Löschen] (https://docs.oracle.com/javase/tutorial/java/generics/erasure.html). –

+0

ok, ich sehe nicht, wie man das verwendet – mathematician

+0

was ist, wenn es nicht ein generischer Typ ist, und es ist immer ein String – mathematician

Antwort

1

In Java Sie es mit Standard-Reflection-API bekommen können (keine Notwendigkeit ReflectionUtils zu verwenden). Sie haben getGenericReturnType korrekt verwendet. Sie müssen es nur ParameterizedType werfen:

public static void main(String[] args) throws NoSuchMethodException { 
    Method m = Test.class.getDeclaredMethod("getThing", String.class); 
    Type type = m.getGenericReturnType(); 
    // type is Thing<java.lang.String> 
    if(type instanceof ParameterizedType) { 
     Type[] innerTypes = ((ParameterizedType) type).getActualTypeArguments(); 
     if(innerTypes.length == 1) { 
      Type innerType = innerTypes[0]; 
      if(innerType instanceof Class) { 
       // innerType is java.lang.String class 
       System.out.println(((Class<?>) innerType).getName()); 
      } 
     } 
    } 
} 
+0

perfekt! Vielen Dank! – mathematician

+0

@mathematiker, eigentlich ist es noch einfacher (und funktioniert auch in Java 1.5), überprüfen Sie die aktualisierte Antwort. –

Verwandte Themen