使用反射得到泛型的实际参数类型

来源:互联网 发布:寻秦ol下载悠米版java 编辑:程序博客网 时间:2024/05/02 00:29

昨天上课,开头讲得是反射,对于反射我感觉自己还是听懂的,至少在概念和原理上把握了反射,以前看过张老师的视频,张老师讲的非常好,不过可惜了,这次来培训,貌似张老师不叫我们,哎。。。遗憾呐。。。以前学过反射,但是还是缕一下思路,复习一下反射吧。

还是向上一篇博客那样,在接触一样新的东东之前,要问问自己三件事(1、这个东东是什么,或者什么是反射, 2,、这个东东能做什么 , 3、在企业里怎么用这个东东)搞清楚了这三个问题,你这东东才能有理论到实践无一不精通。。。

首先什么是反射?

反射就是将java类各个成分映射成相应的java类,这句很经典,一看到这句话估计你就能理解什么是反射啦,一个类中有构造方法,普通方法、成员变量,将它们分别映射成相应的java类,构造方法映射成Constructor类, 普通方法映射成Method类,成员变量映射成Field类,所以在查看Class API时, 能看到各种get打头的方法,返回值是相应的类。

其次反射能做什么?

反射能做什么?在回答这个问题之前,让我们想想以前我们在调用方法的时候,是不是先new出一个对象,然后早使用 (.)点号操作符调用相应的方法。这样调用方法的前提是类名已知,方法名已知。但是自己如果 实现一个框架的时候,就必须要使用反射技术, 框架是什么?打个比方好比盖一座房子,房子的样式千万种,当然不知道建具体哪一种,但是若是先给你一个搭建好了模型,让你在此基础上建立你想要建立房子的样式,岂不是很方便。而这个提前给你给你模式就是我们程序里的框架,框架的通用性的,所以框架不知道你具体想干什么? 比如创建一个类,框架不知道你想创建那个具体的类,所以你给定一个字符串代表类的名字, String className = “com.csdn.HelloWorld";这是框架就会使用反射为创建一个类,Class.forName(className).newInstance(); 这就创建了一个类,框架可以通过反射创建各种各样的类。

最后在企业里怎么使用反射技术?

随着后面的深入学习框架对反射的了解会更加深入,使用反射时就必须要了解反射的基类Class,这个类代表当前运行的类的字节码对象,我们知道在java源程序在被执行之前,首先要被编译成字节码文件,Class就是代表字节码对象,前面说了通过反射可以获得相应的java类,这些类都是从字节码对象身上得到的。

注意:我们知道一个类在内存之中的字节码只有一份,所以不论创建了多少这类的对象时,他们的字节码都是相同的,通过反射得到一位数组的父类是Object,所以只要数组维数相同,不管数组里有几个元素,他们的他们的字节码也是相同的。

反射使用步骤:

1、获得累的字节码

2、获得相应的类(是Constucutor, Method, Field)

3、调用方法生成对象或者获得参数类型或获得(设置)字段的值

例子:通过反射得到泛型的实际参数类型,这也是在上课没想明白,于老师也没讲到的知识,所以今天又将张老师的视频翻出来看看是怎么做的。。。

package cn.itcast.generic;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 GenericDemo1 {public static void main(String[] args) throws Exception, NoSuchMethodException {Vector<Date> vector = new Vector<Date>();Method applyMethod = GenericDemo1.class.getMethod("apply", Vector.class);Type[] types = applyMethod.getGenericParameterTypes();ParameterizedType pType = (ParameterizedType) types[0];System.out.println(pType.getRawType());System.out.println(pType.getActualTypeArguments()[0]);}public static void apply(Vector<Date> v) {}}


 

 

原创粉丝点击