为什么我无法使用反射访问字段 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
。
我的项目使用 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.
因此,要查找和更新私有字段(在给定的 class 中),您需要执行以下操作:
Field field = User.class.getDeclaredField("name");
field.setAccessible(true);
field.set(userObject, value);
(请注意,您还需要使用 setAccessible
来允许访问私有字段。)
如果你想在给定 class 的某个超级 class 中设置命名私有字段,你需要使用 getSuperclass()
遍历超级 class链,直到找到包含您要查找的字段的 Class
。