反射机制

来源:互联网 发布:win10安装不了软件 编辑:程序博客网 时间:2024/06/06 04:00

java反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类。

在运行时构造任意一个类的对象。

在运行时判断任意一个类所具有的成员变量和方法。

在运行时调用任意一个对象的方法。

这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息。

在JDK中,主要由以下类来实现Java反射机制,其中Class类位于java.lang包中,其他类都位于java.lang.reflect包中

--Class类:代表一个类。

--Field类:代表类的成员变量(成员变量也称为类的属性)。

--Method类:代表类的方法。

--Constructor类:代表类的构造方法。

--Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

Class类是Reflection APIs中的核心类,它有以下方法:

--getName():获得类的完整名字,即全路径名。

--getFields():获得类的public类型的属性。

--getDeclaredFields():获得类的所有属性。

--getMethods():获得类的public类型的方法。

--getDeclaredMethods():获得类的所有方法。


反射机制第一步获得操作类的Class对象

一个类不管有多少个对象,这些对象都只对应同一个Class对象。

首先获得要操作类的Class对象clazz获得某个类或某个对象对应的Class对象常用的方法有3种:

1)使用Class类的静态方法forName,根据类的全路径名得到该类的Class对象

Class clazz = Class.forName("java.lang.String");


2)使用类的.class语法获得类的Class对象:

Class clazz = 类名.class;

再获得自己的一个实例:

类名 实例名 = (类名)clazz.newInstance();

该方法返回的是Object类型,可以进行强制类型转换。


3)使用对象的getClass()方法获得类的Class对象:

Class clazz = 类的一个对象.getClass();


反射机制第二步根据Class对象获得目标方法对应的Method对象

获得类的Class对象后,就可以获得这个类中的方法所对应的Method对象了。根据类的Class对象获得类中的方法对应的Method对象也有多种:

如获得类中所有的方法对应的Method对象

Method[] methods = clazz.getDeclaredMethods();


如获得类中已知方法名的public类型的方法对应的Method对象

Method method = clazz.getMethod(String name, Class<?>...  parameterTypes);

该方法接收两个参数:

第一个参数是已知的方法名。如:"add"

第二个参数是与该方法所接收参数类型对应的Class类型的可变参数,可以直接写成数组,也可以离散的传。

如:new Class[]{int.class,int.class},也可以直接写int.class,int.class

如果目标方法是构造方法,根据Class对象获得目标方法对应的Constructor对象,与获得Method对象类似。


反射机制第三步根据Method对象对应目标方法

获得类的方法对应的Method对象后,就可以通过Method类的invoke方法调用Method对象所对应的目标方法

如:

Object result = method.invoke(Object obj, Object...  args);

该方法接收两个参数:

第一个参数:调用目标方法的对象,如果目标方法是静态的,该参数可以为null。

第二个参数:目标方法所接收的参数,是可变参数,可以写数组,也可以离散的传。

如:new Object[]{1,2},也可以直接写1,2

返回的是Object对象,也可以进行强制类型转换,转换成目标方法所返回的类型。

如果目标方法是其他类中的private类型的,可以在调用invoke方法之前,压制Java的访问控制检查:

method.setAccessible(true);

0 0
原创粉丝点击