2016-07-23 5 views
0

Ich habe einige Fragen, wenn ich genericType.First aller reflektieren, ich habe eine Klassendeklaration wie folgt aus:Wie reflektiere ich die Liste <T> der Klasse <T> und bekomme den Inhalt von T?

public class JoyPageWebDTO<T> { 
    private int recordCount; 
    private int pageSize; 
    private int pageIndex; 
    private List<T> records; 
} 

und T:

public class AuditSpuWebDTO implements Serializable { 
    private String indications; 
    private String forbidden; 
    private int shopID; 
    private String shopName; 
    private String city; 
    private Date updateTime; 
    private int auditStatus; 
    private String auditContent; 
} 

Das Ergebnis JoyPageWebDTO nach Anfrage wie folgt aus: [http://i.stack.imgur.com/zeK1O.jpg][1]

die Frage ist, wie kann ich die T (AuditSpuWebDTO) von JoyPageWebDTO bekommen? Ich möchte den Wert von AuditSpuWebDTO bekommen. Ich schrieb einen Code wie folgt, um dies zu behandeln, jedoch fehlgeschlagen!

public static void reflect(Class<?> clazz) { 
    for (Field field : clazz.getDeclaredFields()) { 
     //get the static type of the field 
     Class<?> fieldType = field.getType(); 
     //if it's String, 
     if (fieldType == String.class) { 
      // save/use field 
     } 
     //if it's String[], 
     else if (fieldType == String[].class) { 
      // save/use field 
     } 
     //if it's List or a subtype of List, 
     else if (List.class.isAssignableFrom(fieldType)) { 
      //get the type as generic 
      ParameterizedType fieldGenericType = (ParameterizedType) field.getGenericType(); 
      //get it's first type parameter 
      Type type = fieldGenericType.getActualTypeArguments()[0]; 
      Class<?> fieldTypeParameterClazz; 
      if (type instanceof ParameterizedType) { 
       fieldTypeParameterClazz = (Class<?>) ((ParameterizedType) type).getRawType(); 
      } else if(type instanceof TypeVariable){ 
       //todo how to get the class???? 
      }else{ 
       fieldTypeParameterClazz = (Class<?>) type; 
      } 
      //if the type parameter is String, 
      if (fieldTypeParameterClazz == String.class) { 
       // save/use field 
      } 
     } 
    } 
} 

Wenn ich über die generische Art reflektieren: T von List, der Typ des Ergebnisses ist TypeVariable, wie kann ich die Class<?> von TypeVariable? Die todo, die ich markiere, ist das entscheidende Problem, das ich habe.

+0

Mögliche Duplikate von [Get generischen Typ der Klasse zur Laufzeit] (http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime) – Sam

+2

Schnelle Antwort: nicht möglich. – Sam

Antwort

0

Das einzige, was List weiß es gattungsgemäßen Art ist, dass es einen Namen T

Als Java verwendet Typ Löschung hat, ist es nicht möglich ist, diese Informationen zur Laufzeit zu erhalten. Was möglich ist zu erhalten ist, wenn Sie einen bestimmten Typ in die Klasse kompiliert haben, z.

// create a subclass of ArrayList with a specific type. 
List<String> list = new ArrayList<String>() { }; 

jedoch ein einfaches oder ListArrayList hat keinen Typen in diese Klasse kompilierte so dass sie nicht möglich, von ihm nicht mehr Information abzuzurufen.