代码之家  ›  专栏  ›  技术社区  ›  Michael

为什么我不能使用反射访问field类?

  •  0
  • Michael  · 技术社区  · 4 年前

    我在项目中使用JavaSpring。

    我尝试访问用户类的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
     
    

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

    0 回复  |  直到 4 年前
        1
  •  2
  •   Stephen C    4 年前

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

    getField 方法不返回私有字段。你需要使用 getDeclaredField 获得一个私人领域。但是 getDeclaredField 仅返回目标类的字段。

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

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

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

    如果要在给定类的某个超类中设置命名的私有字段,则需要使用 getSuperclass() 遍历超类链直到找到 Class 这就是你要找的领域。