【问题标题】:Why I can't access to field class using reflection?为什么我无法使用反射访问字段类?
【发布时间】:2021-10-01 00:20:29
【问题描述】:

我的项目使用 java spring。 我尝试访问该属性并使用反射将其设置为特定值。

我尝试访问 User 类的 name 属性:

@Data
public class User {
    @Id
    private String id;
    private String name;
    private String phone;
    private String email;
}

这是我尝试访问名称字段的方式:

User newUser = userRepository.get(id); 
User user = accessProp(newUser, User.class, "name", "John");


public <D> D accessProp(Class<D> dest, String fieldName, Object value ){
    Field filed = null;
    var cls = AdminUser.class;

    filed = cls.getField(fieldName);
    filed.set(dest, value);

    return dest;
}

但是在这一行:

 filed = cls.getField(fieldName);
 

我收到此错误:

 java.lang.NoSuchFieldException: name
 

我的问题是为什么找不到“名称”字段?

【问题讨论】:

标签: java spring reflection lombok


【解决方案1】:

我的问题是为什么找不到“名称”字段?

getField 方法不返回私有字段。您需要使用getDeclaredField 来获取私有字段。但是getDeclaredField 只返回目标类的字段。

因此,要查找和更新私有字段(在给定类中),您需要执行以下操作:

Field field = User.class.getDeclaredField("name");
field.setAccessible(true);
field.set(userObject, value);

(请注意,您还需要使用setAccessible 来允许访问私有字段。)

如果您想在给定类的某个超类中设置命名私有字段,则需要使用getSuperclass() 遍历超类链,直到找到具有您要查找的字段的Class

【讨论】:

  • 感谢您的帖子。在课堂上,我有 @Data 注释,我应该创建公共 Set 道具,知道如何使用它来访问和修改字段值吗?
  • @Michael 使用getMethod("setName", String.class),然后致电method.invoke("Foo")。由于方法是公开的,所以不需要使用getDeclaredMethod,也不需要调用setAccessible
  • @Andreas,感谢您的精彩评论。请问可以发帖吗?
  • @Michael - 你所做的是在评论中询问一个>不同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 2021-05-26
  • 2015-09-24
  • 2010-11-17
  • 2018-10-19
相关资源
最近更新 更多