黑马程序员技术交流社区

标题: 可以通过反射获取集合的泛型吗? [打印本页]

作者: 想要那片海    时间: 2015-5-28 21:19
标题: 可以通过反射获取集合的泛型吗?
比如定义了一个 ArrayList<Integer> list=new ArrayList<Integer>();
怎么通过反射获取list 这个集合的泛型类型?
作者: 程浩9207    时间: 2015-5-29 18:54
本帖最后由 程浩9207 于 2015-5-29 18:56 编辑

package com.itcast.cn_1;

import java.lang.reflect.Method;
import java.util.ArrayList;



public class ArrayListDemo {
public static void main (String[]args) throws Exception, Exception{
        //创建对象
        ArrayList<Integer>list=new ArrayList<Integer>();
        //获取字节码对象
        Class c=list.getClass();
        //获取构造方法
        Method m=c.getMethod("add",Object.class);
        //添加字符串
        m.invoke(list,"hello,world");
        System.out.println(list);
        }
}
作者: 王建伟    时间: 2015-5-29 18:57
你可以先获得这个集合所存的数据,再通过数据,获取数据的字节码文件接着获取类型。
作者: nbcallum    时间: 2015-5-29 19:15
我给你写了一个Map的,这个会了,你那个也就会了

import java.util.*;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Test1  {
       
       
        public static void main(String[] args) throws NoSuchFieldException, SecurityException  {
                Class<MyTest> c = MyTest.class;
                Field f = c.getDeclaredField("myMap");
                /*
                 * 下面这两行对普通的变量好使,对集合就不行了
                Class<?> cl = f.getType();
                System.out.println(cl);
       
                 */
                //获得泛型类型
                Type myType = f.getGenericType();
                // ParameterizedType是被参数化的类型,不懂你可以看看API文档,里面就两个方法
                if(myType instanceof ParameterizedType){
                        ParameterizedType myPType = (ParameterizedType)myType;
                        //返回原始类型
                        Type rType = myPType.getRawType();
                        System.out.println("原始类型是:" + rType);
                        //返回泛型参数的类型
                        Type[] tArray = myPType.getActualTypeArguments();
                        for(int i = 0; i < tArray.length;i++){
                                System.out.println("第" + i + "个泛型类型是:" + tArray[i]);
                        }
                }
}

}

class MyTest{
        private Map<String,Integer> myMap;
}



打印的是:
原始类型是:interface java.util.Map
第0个泛型类型是:class java.lang.String
第1个泛型类型是:class java.lang.Integer


作者: 途中ms前进    时间: 2015-5-30 10:32
学习学习
作者: 星辉祝愿    时间: 2015-5-30 13:24
看帖来学习 了
作者: guojiadui    时间: 2015-5-30 15:43
用反射OK。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2