43_通过反射获得泛型的实际类型参数

框架经常干的事,

根据方法签名得知数据的类型,然后转换成相应的对象,填充进去。

 

package com.itcast.day2;

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

import com.itcast.day1.ReflectPoint;

public class GenericExc {

    public static void main(String[] args) throws Exception{
        Method applyMethod=GenericExc.class.getMethod("applyVector", Vector.class);
        //Type 是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
        Type[] types=applyMethod.getGenericParameterTypes();

        ParameterizedType pType= (ParameterizedType)types[0];//ParameterizedType是Type的子接口
        System.out.println(pType.getRawType());//得到原始类型
        System.out.println(pType.getActualTypeArguments()[0]);//得到实际类型

        //applyVector(Vector v)时, java.lang.Class 
        //applyVector(Vector<Date> v) sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
        System.out.println(types[0].getClass());

        //jdk1.8以后有了简便的方法直接得到了 java.util.Vector<java.util.Date>
        System.out.println(types[0].getTypeName());
    }

    public  void applyVector(Vector<Date> v){

    }

}
时间: 2024-08-02 20:41:56

43_通过反射获得泛型的实际类型参数的相关文章

通过反射获得泛型的实际类型参数

不知道大家有没有尝试过怎样获得一个泛型的实际类型参数?其实这个功能在hibernate中有广泛的应用,那么具体的操作是怎样的呢? 首先,要想直接通过一个变量拿到泛型类型中的实际参数显然是不可能的,参考hibernate源码,只要把这个变量当作一个方法的参数,再通过反射就可以拿到该泛型类型的实际参数. public class GenericsTest { @Test public void test7(){ try { //List<Book> list = new ArrayList<

基于反射和泛型的编程

基于反射和泛型的编程,泛型是容器话的思路统过泛型对象或泛型方法,管理实际 要操作的对象,以实现对于实际对象管理的一种编程. 比如导出excel生成报表这种在平台开发中及其普遍的需求,有多个对象有生成报表 的需求如每个对象编写生成excel逻辑,程序会变得异常复杂,重复逻辑众多,通过将导 出excel逻辑泛型化,需要生成excel的bean本身不需要做任何变化,就可以按照需求生 成对应报表,这是一种很优雅很方便的报表生成方式.

DataTable转任意类型对象List数组-----工具通用类(利用反射和泛型)

public class ConvertHelper<T> where T : new() { /// <summary> /// 利用反射和泛型 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static List<T> ConvertToList(DataTable dt) { //

java反射+java泛型,封装BaseDaoUtil类。供应多个不同Dao使用

当项目是ssh框架时,每一个Action会对应一个Service和一个Dao.但是所有的Ation对应的Dao中的方法是相同的,只是要查的表不一样.由于封装的思想,为了提高代码的重用性.可以使用java中的泛型+反射去实现最终的封装,将所有的Dao层的共同部分写一个BaseDaoUtil.而所有的Dao都继承这个类. 思路: ----->(1)反射+泛型 ----->(2)当生成子类对象(UserDao),调用空构造时(new UserDao()),子类的空构造会默认调用父类的空构造器(new

List转DataTable(反射) ; 将泛型集合类转换成DataTable ; 将集合类转换成DataTable

#region 将集合类转换成DataTable /// <summary> /// 将集合类转换成DataTable /// </summary> /// <param name="list">集合</param> /// <returns></returns> public static DataTable ToDataTable(IList list) { DataTable result = new Dat

通过反射获取泛型信息

1 package com.coscon.reflectionTest; 2 3 import java.lang.reflect.Method; 4 import java.lang.reflect.ParameterizedType; 5 import java.lang.reflect.Type; 6 import java.util.List; 7 import java.util.Map; 8 9 //用过反射获取泛型信息 10 public class ReflectionForGe

java 反射 子类泛型的class

很早之前写过利用泛型和反射机制抽象DAO ,对其中获取子类泛型的class一直不是很理解.关键的地方是HibernateBaseDao的构造方法中的 [java] view plaincopy Type genType = getClass().getGenericSuperclass(); Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); entityClass =  (Class)params[0]

使用反射为泛型集合添加其他类型的数据时遇到的问题

泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合进会去掉“类型”信息,使程序运行效率不受影响. 由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合虽加入其它类型的数据. 所以我们可以用反射为泛型集合添加其他类型的数据. 例1: ArrayList<Integer> arrayList = new ArrayList<Integer>(); arrayList .add(10); a

利用反射,泛型,静态方法快速获取表单值到Model

在项目中经常需要处理表单,给model赋值,很烦人的一些重复代码.如下边的代码: News news = new News(); news.Id = int.Parse(Request.Form["Id"]); news.Category = int.Parse(Request.Form["Category"]); news.Title = Request.Form["Title"]; news.CreateTime = DateTime.Par