A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

比如定义了一个 ArrayList<Integer> list=new ArrayList<Integer>();
怎么通过反射获取list 这个集合的泛型类型?

6 个回复

正序浏览
用反射OK。
回复 使用道具 举报
看帖来学习 了
回复 使用道具 举报
学习学习
回复 使用道具 举报
我给你写了一个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

回复 使用道具 举报
你可以先获得这个集合所存的数据,再通过数据,获取数据的字节码文件接着获取类型。
回复 使用道具 举报
本帖最后由 程浩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);
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马