how2j.cn


工具版本兼容问题
通过反射机制修改对象的属性


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

getField和getDeclaredField的区别

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


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


问答区域    
2019-01-20 关于f.set(h,"teem")
zixue
不太明白h是什么他是怎么制定修改的name属性




1 个答案

朴素的昵称 答案时间:2019-01-23
简单理解,f就是name属性的一个封装 Field f=h.getClass().getDeclaredField("name");



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2019-01-10 扩展:由getDeclaredFields得到其他剩余字段值。
阿兔



验证可以获得private字段,但不能获取值;使用set更改public的字段值,并且使用getDeclaredFields获取剩余字段值。 package Charactor.Hero; import java.lang.reflect.Field; public class TestHero { public static void main(String[] args) { try { Hero h = (Hero)Class.forName("Charactor.Hero.Hero").newInstance();//由反射创建Hero// Field f1= h.getClass().getDeclaredField("name"); Field f2= h.getClass().getDeclaredField("totalTime"); System.out.println(f1);//能够获取到字段,但是不能获取到值,如果println(h.name)会报错// System.out.println(h.totalTime);//能够获取到字段的值// f2.set(h, 2); System.out.println(h.totalTime);//并可以对值进行修改// Field[] fields = h.getClass().getDeclaredFields(); for(int i=1;i<fields.length; i++) { //从1开始是因为name是private,不能得到其值并输出// Field field = fields[i]; System.out.println(field.get(h)); //依次获取h中每个字段// } }catch(Exception e){ e.printStackTrace(); } } }
package Charactor.Hero;

public class Hero {
    private String name;
    public float hp;
    public int damage;
    int totalTime = 3;
   	public int id;
 
    public Hero() {
 
    }
 
    public Hero(String name) {
        this.name = name;
        }

    public Hero(String name, float hp, int damage) {
        this.name = name;
        this.hp = hp;
        this.damage = damage;
        }
 

							


2 个答案

阿兔 答案时间:2019-01-10
附运行结果 public java.lang.String Charactor.Hero.Hero.name 3 2 0.0 0 2 0

阿兔 答案时间:2019-01-10
字段是赋予每个类型的名字,如int i 字段即为"i"



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-08-20 获取字段和访问字段的值都有什么区别?
2017-07-15 getDeclaredField可以访问private字段的值
2016-06-30 getDeclaredField 可以获取本类所有的字段,包括private的?
2016-05-26 getDeclaredField("name"); ?




提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 高级-反射机制-访问属性 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 1001964108
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图