Java利用反射动态设置对象字段值

项目场景:

桥梁信息维护需要做到字段级别的权限控制(包括增删改查),设计包含字段权限配置、字段权限级别管理维护接口两大部分。

1)字段权限配置可参考常见的用户角色管理设计;

2)对于增删改操作,出入参可参考常用的字段传参;对于查找操作,返回每一个字段定义可参考如下:

@Data
public class BridgeFieldDTO {
    /**
     * 是否显示
     */
    private Boolean show = false;
    /**
     * 字段取值
     */
    private Object value;
    /**
     * 字段翻译
     */
    private String valueTranslation;
}

字段级别的权限控制可参考如下思路实现:

1)按照正常逻辑接受或者查询结果

2)建立新对象,根据字段级别权限控制将接受或查询结果放到新对象中;

增删改情况,没有字段权限的字段设置成null值;

查询情况,每个字段按照上述字段定义进行返回;

如何做到字段级别的权限控制,以下是java利用反射机制实现的参考代码:

其中核心方法包括:

获取字段属性:

Class<?> originClazz = NavigableBridgePO.class;
Field[] fields = originClazz.getDeclaredFields();
Map<String,Class> fieldMap = new HashMap<>();
for(Field field: fields){
    fieldMap.put(field.getName(),field.getType());
}

读数据:

Class<?> originClazz = NavigableBridgePO.class;
Method getMethod = originClazz.getMethod(getMethodName);
Object getValue = getMethod.invoke(navigableBridgePO);

写数据:

Class<?> changedClazz = NavigableBridgePO.class;
Method setMethod = changedClazz.getMethod(setMethodName,fieldMap.get(sysRoleFieldPO.getField()));
setMethod.invoke(changedNavigableBridge, getValue);

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设有两个实体类 `EntityA` 和 `EntityB`,它们都有相同的字段,我们可以按照以下步骤进行字段的对比: 1. 首先,我们可以利用 Java反射机制获取 `EntityA` 和 `EntityB` 的所有字段。 ```java Field[] fields = EntityA.class.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Object valueA = field.get(entityA); Object valueB = field.get(entityB); // TODO: 进行字段的对比操作 } ``` 2. 对比两个字段是否相同,可以使用 `Objects.equals()` 方法。 ```java if (!Objects.equals(valueA, valueB)) { // TODO: 对不同的字段进行相应的处理 } ``` 完整的代码样例如下所示: ```java import java.lang.reflect.Field; import java.util.Objects; public class EntityComparisonDemo { public static void main(String[] args) throws Exception { EntityA entityA = new EntityA("1", "John", 20); EntityB entityB = new EntityB("1", "Mary", 21); Field[] fields = EntityA.class.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Object valueA = field.get(entityA); Object valueB = field.get(entityB); if (!Objects.equals(valueA, valueB)) { // TODO: 对不同的字段进行相应的处理 } } } static class EntityA { private String id; private String name; private int age; public EntityA(String id, String name, int age) { this.id = id; this.name = name; this.age = age; } public String getId() { return id; } public String getName() { return name; } public int getAge() { return age; } } static class EntityB { private String id; private String name; private int age; public EntityB(String id, String name, int age) { this.id = id; this.name = name; this.age = age; } public String getId() { return id; } public String getName() { return name; } public int getAge() { return age; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值