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

时间:2022-11-13 12:15:38

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来允许操作这个属性。反射机制真强大。真机智。