反射
来源:互联网 发布:网上邻居网络密码 编辑:程序博客网 时间:2024/04/29 02:01
反射是一种Java编程语言的功能。它允许一个运行中的Java程序检查其本身,以及操作程序的内在属性。举例来说,我们可以得到一个Java class的全体成员的名字并显示它们
简单的实例:
import java.lang.reflect.*;
public class DumpMethods {
public static void main(String args[]) {
try {
Class c = Class.forName("com.bbk.j2ee.ch11.DbUtil");
Method m[] = c.getDeclaredMethods();//获取该Class的所有Method
for (int i = 0; i < m.length; i++)
System.out.println(m[i].toString());
} catch (Throwable e) {
System.err.println(e);
}
}
}
n 使用反射的步骤
n 获取Class对象——封装了一个类或接口的运行期信息
n 调用Class的方法获取信息,如调用getDeclaredMethods获得该类声明的所有方法
n 使用反射API操纵这些信息
获取class的四种方法
Class c = Class.forName(“java.lang.String”);
Class c = obj.getClass();
Class c = int.class;
Class c = Integer.TYPE
获取“方法”信息
n 最有价值的一个用法是找到定义在一个类中的方法
n 有两种方式可以实现这个功能:
n Method methlist1[] = clazz.getMethods();
n Method methlist2[] = clazz.getDeclaredMethods();
n 区别:
n getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方法.
n getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法
获取“构造器”信息
n 类似上例,找出构造器信息
n 找到构造器也有两种方式:
n getConstructors()与getDeclaredConstructors()
n 区别同上。
获取“域成员”信息
n 也可以通过反射获取一个类中定义的域成员的信息
n 获得域成员信息也有两种方式
n getFields()与getDeclaredFields()
n 区别同上。
反射调用方法
n 操作四个步骤,切记!
n 准备一个Class[]作为Method的参数类型
n 调用clazz.getMethod(MethodName, Class[])得到Method对象。
n 准备一个Object[]作为Method对象的invoke ()方法的实参
n 调用Method. invoke(obj, Object[])执行该方法。
反射创建新对象
n 创建新对象有两种方式
n 一个是调用无参数的构造方法
n 一个是调用有参数的构造方法。
n 反射调用构造方法,使用newInstance()。
n 调用无参数的比较简单,直接clazz. newInstance()。
n 调用有参数的构造方法,则需要先得到构造方法在调用。
n 一、准备一个Class[]作为Constructor的参数类型。
n 二、调用Class对象的getConstructor(),得到Constructor对象。
n 三、准备一个Object[]作为Constructor对象的newInstance()方法的实参。
n 四、调用Constructor.newInstance(obj);得到新对象
改变域成员的值
n 另一个使用反射的地方是改变目标对象域成员的值
n 变更Field不需要参数和自变量(不同于方法和构造方法)。
n 操作步骤:
n 调用Class的getField()并指定field名称.
n 调用Field的 get(Object obj)和set(Object obj,Object value)方法操作Field。
n 注意:域成员一般都是私有的,我们无法直接访问到,那怎么办呢?
n 我们可以使用setAccessible(true)方法放弃访问权限检查,就可以访问了。该方法对构造、方法、属性都有用。
使用数组
可以使用反射构造和操纵数组,操作方法和正常的反射类似,只有赋值需要注意