为什么我无法使用反射访问字段 class?

Why I can't access to field class using reflection?

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

我尝试访问用户 class 的名称 属性:

@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
 

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

My question is why is the "name" field not found?

getField 方法没有 return 私有字段。您需要使用 getDeclaredField 来获取私有字段。但是 getDeclaredField 目标 class.

只有 returns 个字段

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

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

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

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