步骤 2 : TestRelection 步骤 3 : getField和getDeclaredField的区别
为了访问属性,把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());
}
}
通过反射修改属性的值
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 只能获取public的,包括从父类继承来的字段。 getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2022-08-21
配置文件与Java代码
2022-01-17
练习 - getField和getDeclaredField的区别
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2021-07-18
为什么我通过setAccessible(true)还是不能访问私有化属性id
2020-05-25
使用f1.setAccessible(true)),访问private字段
2020-01-04
getDeclaredField设置Accessible的问题
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 7 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|