我的项目使用 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
我的问题是为什么找不到“名称”字段?
答案 0 :(得分:2)
我的问题是为什么找不到“名称”字段?
getField
方法不返回私有字段。您需要使用 getDeclaredField
来获取私有字段。但是 getDeclaredField
只返回目标类的字段。
因此要查找和更新私有字段(在给定的类中),您需要执行以下操作:
Field field = User.class.getDeclaredField("name");
field.setAccessible(true);
field.set(userObject, value);
(请注意,您还需要使用 setAccessible
来允许访问私有字段。)
如果要在给定类的某个超类中设置命名私有字段,则需要使用 getSuperclass()
遍历超类链,直到找到具有您所在字段的 Class
寻找。