对反射机制的学习理解

来源:互联网 发布:广告字设计软件 编辑:程序博客网 时间:2024/06/06 00:43



我没学习这个视频之前,对反射可以说是一无所知,等学习了这个视频后,才了解到反射的作用,原来我们还可以从类反推回去找到定义的方法,这引起了我对反射学习的很大的兴趣。以下是我学习反射时候的一些总结。

通常我们使用类都是找到类的路径,然后再实例化类的对象,反射就是通过类的实例化对象找到类的位置。

实例化Class类对象的方法有三种:

第一种:通过forName()方法

第二种:类.class

第三种:对象.getClass()

Class主要是反射的源头,不光可以取得对象所在类的信息,也可以直接通过Class类的方法进行对象的实例化操作正常情况下,使用关键字new为对象实例化,如果现在已经实例化好了class对象,则就可以通过Class类中提供的newInstance()方法

如果要想调用有参,则必须按照以下的步骤进行:

1.       通过Class类中的getConstructors()取得本类中的全部构造方法

2.       向构造方法中传递一个对象数组进去,里面包含了构造方法中所需的各个参数。

3.       之后通过Constructor实例化对象。


但是从实际角度看,如果要使用反射进行对象的实例化操作,最好在类中存在无参构造

在实际开发中,以上的程序就是反射应用最多的地方,当然,反射机制所提供的功能远不止如此,还可以通过反射得到一个类的完整结构,那么这就要使用到java.lang.reflect包中的以下几个类:

Constructor:表示类中的构造方法


Field:表示类中的属性

Method:表示类中的方法

这三个类都是AccessibleObject类的子类

取得类所实现的全部接口,如果要想取得一个类所实现的全部接口,可以使用Class类中的getInterface()方法,因为一个类可以同时实现多个接口,所以在此处将以一个数组的形式返回实现的全部接口。

取得类所继承的父类,一个类只继承一个父类,如果一个类没有明确说明继承哪个类,则肯定继承的是Object类,可使用函数getSuperclass();

取得类所有的构造方法,可以使用getConstructor()方法,返回Constructo类型的数组。

Constructor类中存在以下的几个方法:

取得修饰符:public int getModifiers()

取得方法名称:public String getName()

取得参数的类型:public Class<?> getParameterType()

从之前的程序结果中可以发现,已经取得了构造方法的方法名称及参数类型,但是在取得权限的时候却发现返回的是一个数字而不是public,这是因为在整个JAVA中对于方法的修饰符是使用一定的数字表示出来的,而如果要想把这个数字还原成用户可以看懂的的关键字,则必须依靠Modifier类完成,此类定义在java.lang.reflect包中。直接使用Modifier类下的toString()方法即可还原修饰符。

要想取得一个类的全部方法,可以使用Class类中的getDeclaredMethods()(返回本类异常)方法、getMethod()(返回Object类的全部方法)方法,此方法返回一个Method类的对象数组,而如果要想进一步取得方法的具体信息,例如:方法的参数,抛出的异常声明等等,则就必须依靠Method类。

方法操作:取得全部的返回值:getReturnType()

          取得全部的参数:getParameterType()

          取得修饰符:getModifiers()

          取得异常信息:getExceptionTypes()

在反射操作中也同样可以取得一个类中的全部属性,但是在取得属性的时候有以下两种不同的操作:得到实现的接口或父类中的公共属性:getField();得到本类中的全部属性:getDeclaredFields()。这两种方法返回的都是Field的数组,每个Field对象就表示类中的一个属性。

通过反射调用类中的方法,在正常情况下一个类的对象产生之后,就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚的知道要调用的方法的名称是什么,之后通过Class类中的getMethod()方法,得到一个方法的Method对象,之后通过此Mehtod对象来执行方法,但是方法调用的时候因为会牵扯到方法中的参数的问题,所以通过getMethod()取得的时候,必须设置好需要的参数类型。

执行调用的方法:invoke(),执行的时候还需要传递参数进去,而且需要实例化对象。

通过反射调用属性:如果现在假设要操作一个类中的属性,则也可以通过Filed完成,而不必麻烦的通过setter及getter。此操作与类里的set,get方法无关,即类里没有这两个方法也可完成。

得到公共属性:getFiled()’

得到本类属性:getDeclaredField()

取得属性内容:get()

设置属性内容:set()

在访问私有属性的时候,必须让这个属性可见,将setAccessible()设置为true即可。

反射机制不光可以用在类上,也可以应用在任意的引用数据类型上,当然,这就包含了数组,数组使用Array类完成。使用getComponentType()即可。得到数组指定的下标的内容:public static Object get(Object array,int index)。修改内容:public static void set(Object array,int index).