通过反射机制修改对象的属性
获取成员变量
public Field getField(String name);获取单个公共成员变量
public Field getDeclaredField(String name);获取单个任意成员变量
public Field[] getFields();获取所有公共成员变量
public Field[] getDeclaredFields();获取所有成员变量
获取成员变量
public Field getField(String name);获取单个公共成员变量
public Field getDeclaredField(String name);获取单个任意成员变量
public Field[] getFields();获取所有公共成员变量
public Field[] getDeclaredFields();获取所有成员变量
- Hero.java
为了访问属性,把name修改为public。
对于private修饰的成员,需要使用setAccessible(true)才能访问和修改。不在此知识点讨论。
package charactor; public class Hero { public String name; public float hp; public int damage; public int id; public String getName() { return name; } public void setName(String name) { this.name = name; } public Hero(){ } public Hero(String string) { name =string; } @Override public String toString() { return "Hero [name=" + name + "]"; } public boolean isDead() { // TODO Auto-generated method stub return false; } public void attackHero(Hero h2) { System.out.println(this.name+ " 正在攻击 " + h2.getName()); } }
- TestRelection
通过反射修改属性的值
package reflection; import java.lang.reflect.Field; import charactor.Hero; public class TestReflection { public static void main(String[] args) { Hero h =new Hero(); //使用传统方式修改name的值为garen h.name = "garen"; try { //获取类Hero的名字叫做name的字段 Field f1= h.getClass().getDeclaredField("name"); //修改这个字段的值 f1.set(h, "teemo"); //打印被修改后的值 System.out.println(h.name); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
- getField和getDeclaredField的区别
getField和getDeclaredField的区别
这两个方法都是用于获取字段
getField 只能获取public的,包括从父类继承来的字段。
getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))
获取被private修饰的name属性,需要调用setAccessible(true)方法
f1.setAccessible(true)