我定义了一个集合类,怎么通过类反射机制获取集合的元素类(class) 
比如:List<Integer> list = new ArrayList<Integer>(); 
我怎么得到Integer.class, 

解决方案 »

  1.   

    Class 类的  Type getGenericSuperclass() 获得到type之后强制 转换成ParameterizedType 类型。。然后使用getActualTypeArguments() 获得一个type的数组。。然后取数组的第一个元素。。然后强制转换成class类。。就行了。。
      

  2.   

    是这样的成员变量
    List<List<Integer>> list2 = new ArrayList<List<Integer>> ();
    怎么得到Integer.class,  
      

  3.   

    如果这个变量是成员变量,可以得到,是局部变量,得不到
    for example
    import java.lang.reflect.*;
    public class Test {  
        List<Integer> list = new ArrayList<Integer>();  
        public static void main(String[] args) throws Throwable {
            Field f = Test.class.getDeclaredField("list"); //成员变量
            Type t = f.getGenericType();
            if (t instanceof ParameterizedType) { //可以获得Integer
                System.out.println(((ParameterizedType)t).getActualTypeArguments()[0]);
            }        List<String> slist = new ArrayList<String>(); //局部变量不能获取String
            System.out.println(slist.getClass().getTypeParameters()[0].getName());
            t = slist.getClass().getGenericSuperclass(); //通过超类也不行
            if (t instanceof ParameterizedType) {
                System.out.println(((ParameterizedType)t).getActualTypeArguments()[0]);
            }
            t = slist.getClass().getGenericInterfaces()[0]; //通过超接口也不行
            if (t instanceof ParameterizedType) {
                System.out.println(((ParameterizedType)t).getActualTypeArguments()[0]);
            }
        }
    }
      

  4.   

    注:是这样的成员变量
    List<List<Integer>> list2 = new ArrayList<List<Integer>> ();
    List<List<Integer>> list2 = new ArrayList<List<Integer>> ();
    Type type =list2.getClass().getGenericSuperclass();
    ParameterizedType gtype =(ParameterizedType) type;
    if (gtype instanceof ParameterizedType) {
            
            // list the raw type information
            ParameterizedType ptype = (ParameterizedType)gtype;
            Type rtype = ptype.getRawType();
            System.out.println("rawType is instance of " +
                rtype.getClass().getName());
            System.out.println(" (" + rtype + ")");
            
            // list the actual type arguments
            
            Type[] targs = ptype.getActualTypeArguments();
            System.out.println("actual type arguments are:");
            for (int j = 0; j < targs.length; j++) {
                System.out.println(" instance of " +
                    targs[j].getClass().getName() + ":");
                System.out.println("  (" + targs[j] + ")");
                
                
            }
                } else {
            System.out.println
                ("getGenericType is not a ParameterizedType!");
            
        }我这样写不能获取到Integer.class
      

  5.   

    不知道你 list中有数据么。。如果有数据就好办了。。
      List<Integer> a = new ArrayList<Integer> ();
      a.add(1);
     List<List<Integer>> list2 = new ArrayList<List<Integer>> ();
     list2.add(a);
     System.out.println(list2.get(0).get(0).getClass().getName());
      

  6.   


    public class Test {
    List<List<Integer>> list = new ArrayList<List<Integer>>();
    public static void main(String[] args) throws Throwable {
    Field f = Test.class.getDeclaredField("list"); // 成员变量
    Type t = f.getGenericType();
    if (t instanceof ParameterizedType) {
    Type type = ((ParameterizedType) t).getActualTypeArguments()[0];
    if (type instanceof ParameterizedType) {
    Type integerType = ((ParameterizedType) type).getActualTypeArguments()[0];
    System.out.println(((Class<?>)integerType).getName());
    }
    }
    }
    }
      

  7.   

    自己解析吧
    List<List<Integer>> list2 = new ArrayList<List<Integer>> (); //成员变量public void check() throws Throwable {
            Type type = this.getClass().getDeclaredField("list2").getGenericType();
            if (type instanceof ParameterizedType) {
                
                // list the raw type information
                ParameterizedType ptype = (ParameterizedType)type;
                String clsName = ptype..getActualTypeArguments()[0].toString();
                if (clsName.matches(".*?<.*?>")) {
                    clsName = clsName.replaceAll(".*?<(.*?)>", "$1");
                }
                System.out.println(clsName);
                Class c = class.forName(clsName);
                ...
            } else {
                System.out.println
                    ("getGenericType is not a ParameterizedType!");
                
            }
    }
      

  8.   

    你可以写个递归方法public class Test {
        List<List<Integer>> list2 = new ArrayList<List<Integer>>();
        public static void main(String[] args) throws Throwable {
            Field f = Test.class.getDeclaredField("list2"); 
             Type t = f.getGenericType();
            if (t instanceof ParameterizedType) {
                t = getGenType((ParameterizedType)t);
                System.out.println(t);
                if (t instanceof Class) {
                    ...
                }
            }
        }    public static Type getGenType(ParameterizedType type) { //递归
            Type t = type.getActualTypeArguments()[0];
            if (t instanceof ParameterizedType) {
                t = getGenType((ParameterizedType)t);
            }
            return t;
        }
    }