反射==>获得泛型的实际类型参数

package com.interview.getGenericArgument;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
 * 通过反射技术得到泛型的实际类型参数
 * @author dhh
 *
 */
public class GetGernericArgument {
	public static void main(String[] args) {
		List<Date> lists = new ArrayList<Date>();
		List<String> lists2 = new ArrayList<String>();
		/**
		 * 如果想通过lists,lists2来得到lists的实际类型参数(也就是Date)
		 * 这是不能实现的,因为泛型就是编译器用来防止开发者不按实际类型胡乱
		 * 添加。它编译完之后成class之后,将没有泛型这个概念,
		 * 因为lists.getClass()==list2.getClass()
		 * 但是如果要得到方法里面的实际类型参数,就可以实现
		*/
		//得到getActualArgument方法的实际类型参数
		try {
			Method method =
				GetGernericArgument.class.getMethod("getActualArgument", ArrayList.class,HashMap.class);
			//得到所有泛型参数类型,不能用method.getParameterTypes(),因为class中不包含泛型类型
			Type[] types = method.getGenericParameterTypes();
			System.out.println("**---------第一个参数-------**");
			//Type包含很多种,我们要得到参数化的Type.ParameterizedType 表示参数化类型,如 Collection<String>
			ParameterizedType paramType = (ParameterizedType)types[0];
			//返回 Type 对象,表示声明此类型的类或接口(原始类型)
			System.out.println(paramType.getRawType());
			//得到第一个参数的类型,如果是HashMap<K,V>将会有两个参数
			//返回表示此类型实际类型参数的 Type 对象的数组。
			System.out.println(paramType.getActualTypeArguments()[0]);  
			
			System.out.println("**---------第二个参数-------**");
			//Type包含很多种,我们要得到参数化的Type.ParameterizedType 表示参数化类型,如 Collection<String>
			ParameterizedType paramType2 = (ParameterizedType)types[1];
			System.out.println(paramType2.getRawType());
			System.out.println(paramType2.getActualTypeArguments()[0]);
			System.out.println(paramType2.getActualTypeArguments()[1]);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 通过方法得到参数的实际类型参数
	 * @param lists
	 * @param maps
	 */
	public void getActualArgument(ArrayList<Date> lists,HashMap<Integer, String> maps){}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值