Java 反射设置class中的实体类属性

大佬们,问个问题,就比如:

public class A {

    private B b;
    
 

}

public static class B {
    
    private String name;
    
}

怎么利用反射给A类里面的b属性赋值呢

我直接获取getDeclaredField("b")报错NoSuchFieldException

求大神解惑。

阅读 3.1k
2 个回答

2020-01-01更新

昨晚9点过收到了segmentfault的邮件说题主回复我了,我想今天起来看看,结果今儿我一进来一看,题主并没有回复我,是segmentfault的推送太延迟了。。。囧,不过我滚着屏幕发现题主给另一个回答者回复了,我就看了哈评论,题主是这么回复的
image.png

感觉像是在回复我似的,哈哈哈,因为我让他仔细debug看看是不是我说那种唯一可能,就是
image.png

我也看了哈题主的回复,感觉就是因为把class当成参数传入另一个方法里就不行了,如果不当参数传在外面使用就可以,我惊了!还有这种玩意儿,我都是瞬间都思考到了什么虚拟机的特殊处理或者是什么我没见过的奇怪语法之类的,于是我也copy了题主的回复试试看

没想到,啊嘿,真没错,确实报错了,只要调用方法就报错了(震惊!

震惊之余马上debug,不过我刚一debug一看,泄气了,瞬间就想打题主了。。。
image.png

搁这瞅清楚了,这个时候的class是啥啊?。。。对,没错,竟然是java.lang.Class,回过头我赶紧看了哈题主的方法那里面咋写的
image.png

害,这回瞅清楚了。。。这不就是我说的调用getDeclaredFieldclass和传入的字段名不匹配嘛

题主,咋都已经是class但还要去getClass呢,题主你合计合计,要是你把方法里的代码放外边写那可就变成了这样了

new SameProductSettings().getClass().getClass().getDeclaredField()

是不是炒鸡奇怪。。。(要套娃警告的哈

最后总结哈吧。。。其实题主还是没有学会怎么去debug吧,这个东西认真debug,其实绝对看得出来的。

不过也都是这么过来的,都有犯蠢的时候,最后祝题主新年快乐咯~

以下是原答案


题主看你都用getDeclaredField方法了,按道理被声明的变量都会被查出来,既然你没有查出来,我感觉只有一种可能(铛铛铛!)就是:

你调用getDeclaredField的Class和你传入的字段名字不匹配(狗头

要么class写错了,要么是字段名字写错了

emmm,class写错了几率不大,再差也只是眼花看错了
但是字段名,是个字符串,不知道你真实代码里是怎么写的,虽然你贴出来的样子是"publicConfiguration",谁知道你代码里是不是这么写的,也许还是传入了一个字符串变量,谁又知道你的字符串变量是从哪里获取的
(悄悄告诉你哈:字符串看起来是想象的样子,但是没准里面加了一个什么你看不到的符号,比如我自己遇到过的这个玩意儿\uFEFF,这个玩意儿是读文件的时候发现的,所以你可以尝试debug的时候watch一下,用这里的字符串copy出去到断点看看你的变量是不是和你copyequals

最后,我宁愿相信人会出错,也不会相信机器会出错~哈哈哈哈

Field field = A.class.getDeclaredField("b"); // 对于非 public 属性
field.setAccessible(true);
field.set(instance, value);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题