反射

来源:互联网 发布:网上邻居网络密码 编辑:程序博客网 时间: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     调用ClassgetField()并指定field名称.

n     调用Field getObject obj)和set(Object obj,Object value)方法操作Field

n     注意:域成员一般都是私有的,我们无法直接访问到,那怎么办呢?

n     我们可以使用setAccessible(true)方法放弃访问权限检查,就可以访问了。该方法对构造、方法、属性都有用。

 

 

使用数组

可以使用反射构造和操纵数组,操作方法和正常的反射类似,只有赋值需要注意

原创粉丝点击