某类中有个属性:
...
private List<User> userList;用反射分析这个类的所有属性时,用Field.getType().getGenericType() 取到的该属性类型为:java.util.List<com.abc.User>
怎么可以取到com.abc.User这个类呢?看jdk没找到合适的方法。简单说:我的目标是分析类文件,取到范型容器中实际的类型

解决方案 »

  1.   

    ParameterizedType pt = (ParameterizedType) Field.getType().getGenericType() ;
    Class clz = (Class) pt.getActualTypeArguments()[0];
    System.out.println(clz);
      

  2.   

    ParameterizedType pt = (ParameterizedType) Field.getType().getGenericType() ; 
    Class clz = (Class) pt.getActualTypeArguments()[0]; 
      

  3.   

    试了一下不行呢,当然我写的也不太对,应是 field.getGenericType(),不是Field.getType().getGenericType()。ParameterizedType pt =  (ParameterizedType) f1.getGenericType();//f1是Field对象
    System.out.println(pt.getActualTypeArguments());//这一句报错:
    Exception in thread "main" java.lang.ClassCastException: java.lang.Class
    at test.Test2.main(Test2.java:26)
      

  4.   

    Field field = getClass().getDeclaredField("userList");
    Type gType = field.getGenericType();
    ParameterizedType pType = (ParameterizedType)gType;
    System.out.println(pType.getActualTypeArguments()[0]);
      

  5.   

    嗯,应该是f1.getType();
    Exception in thread "main" java.lang.ClassCastException: java.lang.Class 
    这个错误是由于field不是泛型的定义,所以它不会是ParameterizedType我上面的代码是写死List<String>这样的支持。如果你考虑各种格式,那么需要增加instanceof 的判断
    而且getActualTypeArguments()[0]返回的也不一定是类,类似
    List<List<String>>或者 List<? extends MyClass>这样都不是Class前者还是一个ParameterizedType ,后面是一个WildcardType如果是Map<String, String>那么getActualTypeArguments就返回length为2了。各种情况还比较多
      

  6.   

    嗯,应该是f1.getGenericType(); 上面写错