Java反射机制demo(六)—获得并操作一个类的属性

Java反射机制demo(六)—获得并操作一个类的属性

 

获得并操作一个类的属性?!

不可思议啊,一个类的属性一般都是私有成员变量啊,private修饰符啊!

但是毫无疑问,这些东西在Java的反射机制面前都成了渣渣,Java反射机制读的是字节码,是Class类,有什么获得不了,操作不了的呢。

待实验用的小白鼠Heros类:

package com.aaron.reflect;

public class Heros {
	private String name;//名字
	private String type;//类型
	private int camp;//0,近卫;1,天灾
	
	public Heros(){}

	@Override
	public String toString() {
		return "Heros [\n name=" + name + ", \n type=" + type + ", \n camp=" + camp + "\n]";
	}
	
}

  测试类:

package com.aaron.reflect;

import java.lang.reflect.Field;

public class Demo6 {
	public static void main(String[] args) {
		Class<?> c = Heros.class;
		try {
			Object object = c.newInstance();
			Field[] fields = c.getDeclaredFields();
			System.out.println("Heros所有属性:");
			for (Field f : fields) {
				System.out.println(f);
			}
			
			Field field = c.getDeclaredField("name");
			field.setAccessible(true);
			field.set(object, "炸弹人");
			System.out.println("修改后的属性值:");
			System.out.println(field.get(object));
			System.out.println("修改属性后的Heros:");
			System.out.println((Heros)object);
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

  运行结果:

UserInfo所有方法:
private java.lang.String com.aaron.reflect.Heros.name
private java.lang.String com.aaron.reflect.Heros.type
private int com.aaron.reflect.Heros.camp
修改后的属性值:
炸弹人
修改属性后的UserInfo:
Heros [
 name=炸弹人, 
 type=null, 
 camp=0
]

  注意代码中有一句:

field.setAccessible(true);

  基于对属性的保护,默认为false。这里相当于一个授权的过程,设置true来允许操作这个属性。反射机制真强大。真机智。

posted @ 2015-10-27 17:40  AaronCui  阅读(3493)  评论(0编辑  收藏  举报