再用切面处理方法的参数时,不确定参数的对象具体类型。也不确定这个对象有没有这个字段。但是有的要处理这个字段。所以使用反射来处理。
@Aspect
@Component
public class EnterpriseIdAspect {
@Autowired
private RemoteUserService userService;
@Before("@annotation(AddEnterpriseId)")
public void addEnterpriseId(JoinPoint joinPoint) throws IllegalAccessException {
R<SysUser> userByIdInOrgId = userService.getUserByIdInOrgId(SecurityUtils.getUser().getId(), SecurityConstants.FROM_IN);
Long orgId = userByIdInOrgId.getData().getOrgId();
Long deptId = userByIdInOrgId.getData().getDeptId();
// 获取方法参数
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
// 反射处理实体类中的 orgId 字段
if(arg instanceof List){
((List<?>) arg).forEach(item -> {
try {
addOrgIdToEntity(item, orgId, deptId);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
});
}else
addOrgIdToEntity(arg, orgId ,deptId);
}
}
private void addOrgIdToEntity(Object entity, Long orgId ,Long deptId) throws IllegalAccessException {
if (entity == null) {
return;
}
Field[] fields = entity.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.getName().equals("orgId")) {
field.setAccessible(true);
field.set(entity, orgId);
}
if (field.getName().equals("deptId")){
field.setAccessible(true);
field.set(entity, deptId);
}
}
}
}
-
获取所有声明的字段:
entity.getClass().getDeclaredFields()
返回一个Field
数组,包含了entity
类中声明的所有字段,不论其访问修饰符(即使是私有的)。 -
遍历字段:
for (Field field : fields)
通过for
循环遍历每个字段。 -
检查字段名称: 在循环体内,通过
field.getName().equals("orgId")
和field.getName().equals("deptId")
判断当前字段是否是orgId
或deptId
。 -
设置字段可访问:
field.setAccessible(true)
使得私有字段可以通过反射进行访问和修改。 -
设置字段值:
field.set(entity, orgId)
和field.set(entity, deptId)
使用反射机制将orgId
和deptId
的值赋给entity
实例的相应字段。