Class T{
  List<A>  a;
  List<B>  b;
}Class A {
}
Class B{
}
有这样一个需求:通过反射,获得class T中所有属性的实际类型。下面是我的代码:
Class<?> classType = Class
.forName("T");
Field[] fields = classType.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getType());
}但是执行结果是:
interface java.util.List
interface java.util.List
我想获得a和b的泛型类型,该如何实现?

解决方案 »

  1.   

    问题解决了,这里有答案:http://lorry1113.iteye.com/blog/973903。
    多谢。
      

  2.   

    按理对于泛型有个type erasure,怎么还能在运行时获得泛型类型呢,再细查下
    docs.oracle.com/javase/tutorial/java/generics/erasure.html
      

  3.   

    LZ修改一下你的代码就可以了
    Class<?> classType = Class.forName("csdn$TAB");
    for (Field field : classType.getDeclaredFields()) {
        Class<?> c = field.getType(); //获得属性的类型
        for (TypeVariable tv : c.getTypeParameters()) { //获得属性类型的泛型参数信息
            System.out.println(tv); 
            System.out.println(tv.getBounds()[0]); //泛型的类型
        }    
    }
      

  4.   

    原来是javac在遇到由匿名类实例化的对象时不进行type erasure
    反射这种方式实例化可能与它有某种程度上的联系
      

  5.   

    这里也有两篇关于Java Reflection或Type Token获取Generics Information
    http://tutorials.jenkov.com/java-reflection/generics.html
    http://www.jquantlib.org/index.php/Using_TypeTokens_to_retrieve_generic_parameters至于为什么Reflection可以获取到Generics Information,没有说清楚,粗略地理解的话,可能就是javac有针对性地作了特殊处理。
      

  6.   

    Class<?> classType = Class.forName("T");
    for (Field field : classType.getDeclaredFields()) {
    Class<?> c = field.getType(); // 获得属性的类型
    for (TypeVariable tv : c.getTypeParameters()) { // 获得属性类型的泛型参数信息
    System.out.println(tv);
    System.out.println(tv.getBounds()[0]); // 泛型的类型
    }
    }
    运行了一下,结果如下,以为会得到A...B....E
    class java.lang.Object
    E
    class java.lang.Object
      

  7.   

    是的,我也试了下,这样确实获取不到,获取public field type的话,是这样,但不知道是不是唯一方法,还有private的不知道是不是不能获取:
      

  8.   


    import java.lang.reflect.Field;
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.util.List;public class T {
        public List<A> a;
        List<B> b;    public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchFieldException {
            Field field = T.class.getField("a");        Type genericFieldType = field.getGenericType();
                
            if(genericFieldType instanceof ParameterizedType){
                ParameterizedType aType = (ParameterizedType) genericFieldType;
                Type[] fieldArgTypes = aType.getActualTypeArguments();
                for(Type fieldArgType : fieldArgTypes){
                    Class fieldArgClass = (Class) fieldArgType;
                    System.out.println("fieldArgClass = " + fieldArgClass);
                }
            }
        }
    }class A {
    }class B {
    }
    fieldArgClass = class A
      

  9.   

    那就像13L那样,获取属性的泛型而不是获取属性的类型
    Class<?> classType = Class.forName("T");
    for (Field field : classType.getDeclaredFields()) {
        Type ft = field.getGenericType(); 
        if (ft instanceof ParameterizedType) {
            for (Type fpt : ((ParameterizedType)ft).getActualTypeArguments()) { 
                System.out.println(fpt);  
            }
        }    
    }不过这样只能针对集合类型的泛型定义的属性,如果是直接泛型定义的属性是取不到的(只能取到Object),如
    class T<E> {
        E a;
    }...
    T<String> t = new T<String>();
    //反射获取t的a属性的类型,是取不到String的