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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尤圣回 中级黑马   /  2012-9-17 23:08  /  2479 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如何通过反射技术获取泛型中的类型

3 个回复

倒序浏览
比如集合类 list set map 预先不知道会存什么对象进去 所以就用泛化的类型指示List<String> 实际使用的时候 标明存String。
反射主要用在一些特殊情况,比如当你在写代码时,你无法确定要使用哪个类,或者是你动态的要创建某个类的实例,而此类又不是固定的。反射可以动态的获取对象的类型信息,比如此对象是哪个类,其有哪些属性、方法等。
回复 使用道具 举报
jdk1.5开始支持泛型,所以我们有时需要把泛型里定义的对象的类型拿到

比如现在我定义了三个类Account, AccountItem和Product类。

Account聚合AccountItem,AccountItem聚合Prodcut。

都是用List<AccountItem>和List<Product>来表示的

我要实现一个功能,需要动态的传入一个Class的类型,然后反射到启动的List,根据List里定义的泛型,知道其中List的具体对象。

这个需求主要是由于现在的Json-lib还不支持深度的List的unmarshall,而只支持数组的方式。其实这里就是json-lib的beanfactory用到ezmorpher,而ezmorpher不支持泛型的定义方式,所以不知道类型,全转成MorpherDynBean,这样的对象是我们不需要的。

这样需要修改ezmorpher的代码,注入自己的MorpherBean的processor,这个processor就根据泛型拿到,我们需要转型的对象。

代码片段如下

Java代码  




Field[] fs = clazz.getDeclaredFields(); // 得到所有的fields  

  

for(Field f : fs)   

{   

    Class fieldClazz = f.getType(); // 得到field的class及类型全路径  

  

    if(fieldClazz.isPrimitive())  continue;  //【1】 //判断是否为基本类型  

  

    if(fieldClazz.getName().startsWith("java.lang")) continue; //getName()返回field的类型全路径;  

  

    if(fieldClazz.isAssignableFrom(List.class)) //【2】  

    {   

             Type fc = f.getGenericType(); // 关键的地方,如果是List类型,得到其Generic的类型  

  

             if(fc == null) continue;  

  

             if(fc instanceof ParameterizedType) // 【3】如果是泛型参数的类型   

            {   

                   ParameterizedType pt = (ParameterizedType) fc;  

  

                   Class genericClazz = (Class)pt.getActualTypeArguments()[0]; //【4】 得到泛型里的class类型对象。  

  

                   m.put(f.getName(), genericClazz);  

  

                   Map<String, Class> m1 = prepareMap(genericClazz);  

  

                   m.putAll(m1);   

             }   

      }   

}  




回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马