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公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2022-01-17 练习 - getField和getDeclaredField的区别
莫諾




getField和getDeclaredField的区别 这两个方法都是用于获取字段 getField 只能获取public的,包括从父类继承来的字段。 getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))
加载中
Hero h = new Hero();
		ADHero adh = new ADHero();
		// 使用传统方式修改name的值为garen
		adh.name = "masterYi";
		h.name = "garen";
		// get Field
		try {
			// 获取类Hero的名字叫做name的字段 public
						Field f1 = h.getClass().getField("name");
						f1.set(h, "teemo1");
						// 打印被修改后的值
						System.out.println(h.name);
						// 获取类Hero的名字叫做name的字段 public
						Field f2 = adh.getClass().getField("name");
						f2.set(adh, "Miss Fortune1");
						// 打印被修改后的值
						System.out.println(adh.name);
						try {
							Field f3 = h.getClass().getField("hp");
							f3.set(h, "500.3");
							// 打印被修改后的值
							System.out.println(h.getClass().getDeclaredField("hp"));
						} catch (Exception e) {
							System.out.println("getField不可获取private字段\n");
						}
		} catch (Exception e) {
			e.printStackTrace();
		}
		// getDeclaredField
		try {
			// 获取类Hero的名字叫做name的字段 public
			Field f1 = h.getClass().getDeclaredField("name");
			f1.set(h, "teemo2");
			// 打印被修改后的值
			System.out.println(h.name);
			Field f2 = h.getClass().getDeclaredField("hp");
			try {
				f2.set(h, "500.3");
//				f2.setAccessible(true);
			} catch (Exception e) {
//				System.out.println("如果执行了f2.setAccessible(true), 不会抛出异常");
				System.out.println("getDeclaredField可获取private字段,但是会弹出错误:Class reflection.TestReflection can not access a member of class charactor.Hero with modifiers \"private\"");
			}
			try {
				// 获取类Hero的名字叫做name的字段 public
				Field f3 = adh.getClass().getDeclaredField("name");
				f3.set(adh, "Miss Fortune2");
				// 打印被修改后的值
				System.out.println(adh.name);
			} catch (Exception e) {
				System.out.println("getDeclaredField继承字段不可获取");
			}			
		} catch (Exception e) {
			e.printStackTrace();
		}

							





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





2021-07-18 为什么我通过setAccessible(true)还是不能访问私有化属性id
小白的迷茫




. .我把Hero的id字段,设置了private,通过setAccessible(true);还是不能访问
加载中
public static void main(String[] args) {
        Hero hero=new Hero();
        try {
            Field field=hero.getClass().getField("name");
            field.set(hero,"盖伦");
            Field field1=hero.getClass().getDeclaredField("id");
            field1.setAccessible(true);
            System.out.println(hero.name);
            System.out.println(hero.id);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

							


1 个答案

橘子西瓜
答案时间:2021-08-07
你理解错了,通过设置setAccessible(true)类访问private属性,并不是指通过hero.id进行获取,而是指field1.get(hero)进行获取id的值得意思



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





2020-05-25 使用f1.setAccessible(true)),访问private字段
2020-01-04 getDeclaredField设置Accessible的问题
2019-07-22 怎么获得子类和父类的所有属性?


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 6 条以前的提问,请 点击查看

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

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

上传截图