反射

来源:互联网 发布:互联网中文域名 编辑:程序博客网 时间:2024/05/29 03:54

一、反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

二、通过反射获取构造方法并使用

1获取构造方法

getConstructors  ××获取的public的构造方法

getDeclaredConstructors  ××获取所有构造方法

2创建对象

newInstance()

con.newInstance(“zhangsan", 20);

三、通过反射获取成员变量并使用

1获取所有成员

getFields,getDeclaredFields

2获取单个成员

getField,getDeclaredField

3修改成员的值

set(Object obj,Object value)
   将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

四、通过反射获取成员方法并使用

1获取所有方法

getMethods

getDeclaredMethods

2获取单个方法

getMethod

getDeclaredMethod

3暴力访问

method.setAccessible(true);

五、反射应用举例

1通过配置文件运行类中的方法

我给你ArrayList<Integer>的一个对象,我想在这个集合中添加一个字符串数据,如何实现呢?

 

public class ArrayListDemo {public static void main(String[] args) throws NoSuchMethodException,SecurityException, IllegalAccessException,IllegalArgumentException, InvocationTargetException {// 创建集合对象ArrayList<Integer> array = new ArrayList<Integer>(); // array.add("hello");// array.add(10); Class c = array.getClass(); // 集合ArrayList的class文件对象Method m = c.getMethod("add", Object.class); m.invoke(array, "hello"); // 调用array的add方法,传入的值是hellom.invoke(array, "world");m.invoke(array, "java"); System.out.println(array);}}


2写一个方法,

public void setProperty(Object obj, String propertyName, Object value){},

此方法可将obj对象中名为propertyName的属性的值设置为value。

Tool.classpublic class Tool {public void setProperty(Object obj, String propertyName, Object value)throws NoSuchFieldException, SecurityException,IllegalArgumentException, IllegalAccessException {// 根据对象获取字节码文件对象Class c = obj.getClass();// 获取该对象的propertyName成员变量Field field = c.getDeclaredField(propertyName);// 取消访问检查field.setAccessible(true);// 给对象的成员变量赋值为指定的值field.set(obj, value);}}ToolTest.classpublic class ToolTest{public static void main(String[] args) throws NoSuchFieldException,SecurityException, IllegalArgumentException, IllegalAccessException {Person p = new Person();Tool t = new Tool();t.setProperty(p, "name", "lfsenior");t.setProperty(p, "age", 20);System.out.println(p);}} 


 

 

原创粉丝点击