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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 yufeng47 于 2013-4-19 08:41 编辑
  1. package cn.itcast.day2;

  2. import java.lang.reflect.ParameterizedType;
  3. import java.lang.reflect.Type;
  4. import java.lang.reflect.TypeVariable;
  5. import java.util.ArrayList;
  6. import java.util.Collection;

  7. public class GenericQuestion {

  8.         /**
  9.          * @param args
  10.          * @throws Exception
  11.          */
  12.         public static void main(String[] args) throws Exception {
  13.                
  14.                 ArrayList<String> collection1 = new ArrayList<String>();
  15.                 Collection<? extends Number> collection2 = new ArrayList<Byte>();
  16.                
  17.                 getCollectionTypeOfParameter(collection1);
  18.                 getCollectionTypeOfParameter(collection2);        
  19.         }

  20.         
  21. /*        用反射方式获取参数列表中类型变量*/
  22.         public static void getCollectionTypeOfParameter(Collection<?> src)
  23.                         throws Exception{

  24.                 TypeVariable<?>[] typeVariable = src.getClass().getTypeParameters();
  25. //                获取引用的通用声明(GetGenericDeclaration)的类型变量(API中对其声明的类型变量)
  26.                 System.out.println(typeVariable[0].getGenericDeclaration());
  27. //                获取引用的类型               
  28.                 System.out.println(typeVariable[0].getName());
  29. //                获取类型变量的上边界,上边界一般为Object(除非<? extends Number>,则为Number)
  30.                 Type[] type = typeVariable[0].getBounds();
  31.                 System.out.println(type[0]);

  32.                
  33. //                获取方法的原始参数类及其类型变量
  34.                 Type[] types = GenericQuestion.class.getMethod
  35.                                 ("getCollectionTypeOfParameter", Collection.class).getGenericParameterTypes();
  36.                 ParameterizedType typeOfParameter = (ParameterizedType)types[0];
  37.                 System.out.println(typeOfParameter.getRawType());                                //原始参数类型
  38.                 System.out.println(typeOfParameter.getActualTypeArguments()[0]);//类型参数
  39.         }
  40. }
复制代码
/*        
        由于java中泛型是用于编译器行类型检查和类型推断的,在正式运行生成原始类的字节码时会用擦除技术抹去,
        所以貌似不可能实现获取引用的实例化类型参数。不过还是要问哈童鞋们,这种方式能实现么?即上述方法中
        如果传入的引用类型是ArrayList<String>,能否就得到原始类 ArrayList和类型变量String呢?  
*/

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

3 个回复

倒序浏览
  1. package com.test;

  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.ParameterizedType;
  4. import java.lang.reflect.Type;
  5. import java.util.ArrayList;

  6. public class Test1 {
  7.         //声明一个传入ArrayList<String>类型参数的方法,不需要方法体
  8.         public static void noUse(ArrayList<String> alist){}
  9.        
  10.        
  11.         public static void main(String[] args) throws Exception{
  12.                 //通过反射得到刚刚声明的方法
  13.                 Method method = Test1.class.getMethod("noUse",ArrayList.class);
  14.                 //得到这个方法的参数列表
  15.                 Type[] types = method.getGenericParameterTypes();
  16.                 //如果第一个参数是参数化类型,下面就好办了
  17.                 if(types[0] instanceof ParameterizedType){
  18.                         ParameterizedType pType = (ParameterizedType)types[0];
  19.                         Type[] temp = pType.getActualTypeArguments();
  20.                         System.out.println(temp[0]);//输出:class java.lang.String
  21.                 }
  22.                
  23.         }
  24. }
复制代码
刚刚翻了半天资料,终于找到了一种解决方案。
看看对你有没有用。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
  na shi 必须能的  多看一些张孝祥老师的视频把
回复 使用道具 举报
王洪宇 发表于 2013-4-14 10:26
刚刚翻了半天资料,终于找到了一种解决方案。
看看对你有没有用。

虽然不是我想要的,但是还是谢谢。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马