实质就是拦截指定的方法之后,获取他们的参数,然后修改,并将修改的值传入到.proceed()方法中,然后如果想要修改返回的值,直接创建新的对象,返回回去即可,但是类型要与原方法返回的类型相同

demo:

 @Pointcut("execution(* zhaoyy.springboot_shiro.mapper.*.*(..))")
    public void point() {
    }

    @Around(value = "point()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object obj = SecurityUtils.getSubject().getPrincipal();
        if (obj != null) {
            User user = (User) obj;
            Integer id = user.getId();
            log.warn("userId:" + id);
            log.warn("args:" + JSONObject.toJSONString(proceedingJoinPoint.getArgs()));

            Object[] args = proceedingJoinPoint.getArgs();
            // 将获取的值进行修改
            args[1] = "and status = 2";
            // 然后继续执行该接口(这里修改参数)
            Object ret = proceedingJoinPoint.proceed(args);  //将新的参数传入
            log.error("返回的结果为:"+JSONObject.toJSONString(ret));
            // 这里定义一个新的对象用来返回,
            // 这里是用来测试的,所以数据是随机的,但是返回的类型要与刚开始的类型相同
            User user1 = new User();
            user1.setUsername("有趣");
            return user1;  //返回新的返回值,类型与方法原来的返回值相同
        }
       return proceedingJoinPoint.proceed();
    }

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐