分享

Java 反射:怎么取出类的泛型类型

 瑶疏影 2016-03-07

因为类的成员变量在编译时会保留其类型信息的。
如下E是泛型类型,Set<E> e,在类型推导时会替换为Object的,所以你无法获取到类型信息,而e2,定义时就包含了类型信息,故可以获取到。

Java代码  收藏代码
  1. public class TypesTest<E> {  
  2.     Set<E> e;  
  3.     Set<Integer> e2;  
  4. }  


完整测试代码如下
Java代码  收藏代码
  1. import java.lang.reflect.GenericArrayType;  
  2. import java.lang.reflect.ParameterizedType;  
  3. import java.lang.reflect.Type;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import java.util.Set;  
  7.   
  8. import org.junit.Test;  
  9.   
  10. public class TypesTest {  
  11.     Map<String, Integer> a;  
  12.     Inner<Float, Double> b;  
  13.     List<Set<String>[][]> c;  
  14.     List<String> d;  
  15.     Set<String> e;  
  16.     Outer<String>.Inner f;  
  17.   
  18.     private ParameterizedType mapStringInteger;  
  19.     private ParameterizedType innerFloatDouble;  
  20.     private ParameterizedType listSetStringArray;  
  21.     private ParameterizedType listString;  
  22.     private ParameterizedType setString;  
  23.     private ParameterizedType outerInner;  
  24.     private GenericArrayType setStringArray;  
  25.   
  26.     private String toString(ParameterizedType parameterizedType) {  
  27.         Type[] types = parameterizedType.getActualTypeArguments();  
  28.         String ret = "\n\t" + parameterizedType + "\n\t\t泛型个数:" + types.length + "==>";  
  29.         for (Type type : types) {  
  30.             ret += type + ", ";  
  31.         }  
  32.         return ret;  
  33.     }  
  34.   
  35.     @Test  
  36.     public void main() throws Exception {  
  37.         mapStringInteger = (ParameterizedType) getClass().getDeclaredField("a").getGenericType();  
  38.         innerFloatDouble = (ParameterizedType) getClass().getDeclaredField("b").getGenericType();  
  39.         listSetStringArray = (ParameterizedType) getClass().getDeclaredField("c").getGenericType();  
  40.         listString = (ParameterizedType) getClass().getDeclaredField("d").getGenericType();  
  41.         setString = (ParameterizedType) getClass().getDeclaredField("e").getGenericType();  
  42.         outerInner = (ParameterizedType) getClass().getDeclaredField("f").getGenericType();  
  43.         setStringArray = (GenericArrayType) listSetStringArray.getActualTypeArguments()[0];  
  44.           
  45.         System.out.println("a Map<String, Integer> 推导擦除后类型信息:" + toString(mapStringInteger));  
  46.         System.out.println();  
  47.         System.out.println("b Inner<Float, Double> 推导擦除后类型信息:" + toString(innerFloatDouble));  
  48.         System.out.println();  
  49.         System.out.println("c List<Set<String>[][]> 推导擦除后类型信息:" + toString(listSetStringArray));  
  50.         System.out.println();  
  51.         System.out.println("d List<String> 推导擦除后类型信息:" + toString(listString));  
  52.         System.out.println();  
  53.         System.out.println("e Set<String> 推导擦除后类型信息:" + toString(setString));  
  54.         System.out.println();  
  55.         System.out.println("f Outer<String>.Inner 推导擦除后类型信息:" + toString(outerInner));  
  56.         System.out.println();  
  57.         System.out.println("c List<Set<String>[][]> List第二层Set的泛型推导信息:" + setStringArray);  
  58.     }  
  59.   
  60.     class Inner<T1, T2> {  
  61.     }  
  62.   
  63.     static class Outer<T> {  
  64.         class Inner {  
  65.         }  
  66.     }  
  67. }  

2012年9月22日 15:04
skzr.org skzr.org
311
0 1 7

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多