how2j.cn

通过反射机制修改对象的属性

步骤 1 : Hero.java   
步骤 2 : TestRelection   
步骤 3 : getField和getDeclaredField的区别   

步骤 1 :

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()); } }
步骤 2 :

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(); } } }
步骤 3 :

getField和getDeclaredField的区别

getField和getDeclaredField的区别
这两个方法都是用于获取字段
getField 只能获取public的,包括从父类继承来的字段。
getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (: 这里只能获取到private的字段,但并不能访问该private字段的,除非加上setAccessible(true))


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2017-07-15 getDeclaredField可以访问private字段的值
DanOu2017



是可以取到的
 Field f1= h.getClass().getDeclaredField("name");
            f1.setAccessible(true);
            
            //修改这个字段的值
            System.out.println(f1.get(h));

							


2 个答案

hfutqy 答案时间:2017-08-16
private可读?不可写是肯定的,只有添加 f1.setAccessible(true);方法设置可写

how2j 答案时间:2017-07-17
嗯,是的




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2016-06-30 getDeclaredField 可以获取本类所有的字段,包括private的?
panda




							

							


4 个答案

yll_1008 答案时间:2017-07-06
获取被private修饰的name属性,需要调用setAccessible(true)方法
f1.setAccessible(true)

how2j 答案时间:2017-01-04
知道有这么一个字段

丢丢 答案时间:2017-01-03
既然private字段不能获取其值,那获取了字段又有什么意义呢?

how2j 答案时间:2016-07-01
你的代码里不就获取到私有字段了么?

问题是出在不能访问私有字段。 获取和访问是不同的概念哦。

getDeclaredField能够把私有字段也获取到,但是却不能获取其值,也不能修改其值。




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2016-05-26 getDeclaredField("name"); ?




提问之前请登陆
关于 JAVA 高级-反射机制-访问属性 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 389538688
站长会在每个工作日早上尽量回答提问(如果有漏掉没有回答的,请进群提醒一下)
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
站长是玻璃心,提问的时候请语气温柔些 kiss~
截止2017-5-19日累计提问 1638个,站长回答了 1546个
截止2017-8-15日累计提问 2788个,站长回答了 2544个

上传截图