ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> 通过反射机制修改对象的属性 # Hero.java 为了访问属性,把name修改为public。 ``` package charactor; import java.io.Serializable; public class Hero2 implements Serializable { 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 Hero2() { } public Hero2(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(Hero2 h2) { System.out.println(this.name + " 正在攻击 " + h2.getName()); } } ``` # 测试类 通过反射修改属性的值 ``` package com.dodoke.reflection; import java.lang.reflect.Field; import charactor.Hero; public class TestReflection4 { 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) { e.printStackTrace(); } } } ``` > getField和getDeclaredField的区别 > 这两个方法都是用于获取字段 > getField 只能获取public的,包括从父类继承来的字段。 > getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))