使用反射获取泛型类型

前面在写绕过反射对泛型直接赋值的blog中有写到:泛型在内存中字节码只有一份,就是编译完成之后就没有类型信息了,已经去类型化了。现在我们想想怎么通过反射来获取泛型的类型呢?由于已经去类型化了,使用普通的反射根本就获取不了。

但是可以通过下面的方法可以获取:

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.Vector;

public class GenericAndReflect {
 public static void main(String[] args) throws Exception{
  Vector<Date> v1 = new Vector();//获取Vector的Date泛型,通过反射看似根本不可能
  Method method =GenericAndReflect.class.getMethod("applyVector", Vector.class);
  Type [] types = method.getGenericParameterTypes();//获取泛型参数类型
  ParameterizedType ptype = (ParameterizedType)types[0];// 现在只有一个泛型
  System.out.println(ptype.getRawType());//getRawType()获取自己原始类型
  System.out.println(ptype.getActualTypeArguments()[0]);//获取实际化的类型参数
  }
 //解决的方法就是创建一个方法,把泛型的类型传给方法  通过方法来获取参数列表类型
 //因为Method类中有getGenericParameterTypes()方法,这个方法是按照声明顺序返回 Type 对象的数组,
 //这些对象描述了此 Method 对象所表示的方法的形参类型的
 //还有一个方法 getParameterTypes()按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。
 public static void applyVector(Vector<Date> v){
  
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值