Aop反射机制实现某个参数值 修改

   项目中使用敏感字段的加解密,但是有的是直接在url中拼接的 ,所以我就想根据一个自定义注解的方式做匹配 ,修改值

利用反射的机制实现值的修改
以下是具体的代码

  1. 依赖aop
 <!-- SpringBoot 拦截器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
  1. aop注解
/**
 * @author lkz
 * @date 2021/12/13 14:43
 * @description 参数方法
 */
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ArgAnnotationMethod {
}

@Documented
@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ArgsAnnotation {

}


  1. AOP切面
@Aspect
@Component
@Slf4j
public class AopArgsDemo {

    @Pointcut("@annotation(com.demo.user.aop.annotation.ArgAnnotationMethod)")
    public void pointParam(){

    }

    @Before("pointParam()")
    public static void startArs(JoinPoint joinPoint) throws IllegalAccessException, NoSuchFieldException {

        final Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        final String[] names = methodSignature.getParameterNames();//获取参数的名字
        final Object[] args = joinPoint.getArgs();// 获取参数的值
        String name = joinPoint.getSignature().getName();//获取方法的名字
        //获取参数注解 :1维是参数,2维是注解
        Annotation[][] annotations  = methodSignature.getMethod().getParameterAnnotations();
        for(int i=0;i<annotations.length;i++){
         Object param=args[i];
        Annotation[] paramAn= annotations[i];
        //参数为空 直接下一个参数
            if(param==null || paramAn.length==0){
                continue;
            }
            for(Annotation annotation:paramAn){
                //判断是否包含某个制定的注解
                if(annotation.annotationType().equals(ArgsAnnotation.class)){
                    //效验改参数 验证一次并退出改注解
                    Field field = String.class.getDeclaredField("value"); //value是固定值 就是这样写
                    field.setAccessible(true);
                    field.set(param,field.get("南京"));
                    break;
                }
            }
        }

        System.out.println("AopArgsDemo切面执行获取参数方法:"+name+"方法开始执行,参数是:"+ Arrays.asList(args));
    }


  1. 测试
@RestController
@Slf4j
@RequestMapping("aop")
public class AopTestController {

   
    @GetMapping("test3")
    public void testArg(String name){
        System.out.println("aop 测试方法路径参数:"+name);
    }

    @GetMapping("test4")
    @ArgAnnotationMethod
    public void testArg4(@ArgsAnnotation String name,@ArgsAnnotation String age,String adree){
        System.out.println("aop 测试方法路径参数:"+name+"-----年龄"+age+"----地址:"+adree);
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值