首页 > 其他分享 >动态代理 动态修改注解上的参数

动态代理 动态修改注解上的参数

时间:2023-02-15 19:13:42浏览次数:48  
标签:purchase ruijie 代理 version import 注解 动态 com annotation

动态代理

AOP切面代码

被代理对象
 Object target = joinPoint.getTarget();
当前对象
Object aThis = joinPoint.getThis();
这里拿到的方法和反射的方法获取的不是一样的
 Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();

  Method method1 = null;
        try {
            method1 = target.getClass().getMethod(method.getName(), method.getParameterTypes());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

动态代理 修改注解上的方法

import com.ruijie.businesslog.annotation.SendFeishu;
import com.ruijie.framework.base.config.BaseEnvironmentConfigration;
import com.ruijie.purchase.exception.PurchaseAppCode;
import com.ruijie.purchase.exception.scm.PmdException;
import com.ruijie.purchase.service.OpsDataService;
import com.ruijie.purchase.service.PurchaseMinorDemandHistoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Map;
import java.util.function.Consumer;

/**
 * @menu TODO
 * @BelongsProject: minor-purchase
 * @BelongsPackage: com.ruijie.purchase.ops.job
 * @Author: [email protected]
 * @CreateTime: 2023-02-15  15:13
 * @Version: 1.0
 */
@Component
@Slf4j
public class OpsSolidifiedVersionScheduleAfterJob {

    @Autowired
    private BaseEnvironmentConfigration baseEnvironmentConfigration;

    @Autowired
    private OpsDataService opsDataService;

    @Autowired
    private PurchaseMinorDemandHistoryService purchaseMinorDemandHistoryService;

    @Scheduled(cron = "${purchase.email.Job.solidifiedVersionAfter.cron:0 5 22 ? * 2}")
    @SendFeishu("XXX-${version}版本数据上传校验")
    public String solidifiedVersionScheduleAfter()  {
        String version = purchaseMinorDemandHistoryService.getMaxVersion();

        try {
            //生成代理增加版本控制 修改@SendFeishu("XXX-${version}版本数据上传校验") 中的 ${version}
            sendFeishuProxy(version);
        } catch (Exception e) {
            throw new PmdException(new PurchaseAppCode("",e.toString()));
        }

//        String currentEnv = baseEnvironmentConfigration.getCurrentEnv();
//        //不在开发环境运行
//        if (EnvEnum.dev.name().equals(currentEnv)) {
//            log.info("定时任务不在开发环境运行!");
//            return "定时任务不在开发环境运行!";
//        }
        return opsDataService.solidifiedVersionScheduleAfter(version);
    }


    private void sendFeishuProxy(String version) throws Exception {
        Class<? extends OpsSolidifiedVersionScheduleAfterJob> clz = this.getClass();
        //int i = 1/0;

        Method solidifiedVersionScheduleAfter = clz.getMethod("solidifiedVersionScheduleAfter");
        SendFeishu annotation = solidifiedVersionScheduleAfter.getAnnotation(SendFeishu.class);
        if (annotation != null) {
            modifyFiled(annotation, map -> {
                String value = (String) map.get("value");
                value = value.replace("${version}", version == null ? "" : version);
                map.put("value", value);
            });
        }
    }

    private void modifyFiled(SendFeishu annotation, Consumer<Map> consumer) throws Exception {
        //生成代理类对象
        InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);
        Field annotationValues = invocationHandler.getClass().getDeclaredField("memberValues");

        annotationValues.setAccessible(true);
        Map map = (Map) annotationValues.get(invocationHandler);
        consumer.accept(map);
    }
    
}


标签:purchase,ruijie,代理,version,import,注解,动态,com,annotation
From: https://www.cnblogs.com/yexuba/p/17124339.html

相关文章

  • vue中element-ui配置一二级导航动态渲染并跳转
    这次的导航效果,包括二级导航,请认真食用~先看下效果图吧具体的步骤如下1.安装element-uinpminstallelement-ui--save或cnpminstallelement-ui--save2.需要准......
  • @JsonInclude注解
    @JsonInclude注解是jackSon中最常用的注解之一,是为实体类在接口序列化返回值时增加规则的注解例如,一个接口需要过滤掉返回值为null的字段,即值为null的字段不返回,可以在实......
  • JDK动态代理
    JDK动态代理是面向接口的。这是很多框架的基础。JDK动态代理的原理是接口的实现,所以接口一定要存在,而且只能代理接口存在的方法.首先动态代理类要实现InvocationHand......
  • CGLIB动态代理
    CGLIB动态代理是基于类继承的代理,不能被继承的方法也不能被代理,比如final,private修饰的方法.CGLIB中重要的两个概念:MethodInterceptor是方法拦截器,代理类只需......
  • uniapp中动态计算屏幕高度问题
    在html中可使用动态高度   在data中winHeight:'',在onLoad中this.scrollH() 在方法中使用//动态计算高度 scrollH:function(){ letsys=uni.getS......
  • ignite系列之6-- 使用注解配置索引
    官方连接:见处理SQL-3.2.使用注解配置索引https://www.ignite-service.cn/doc/java/WorkingwithSQL.html#_3-2-%E4%BD%BF%E7%94%A8%E6%B3%A8%E8%A7%A3%E9%85%8D%E7%BD%AE%E......
  • 时隔多年,这次我终于把动态代理的源码翻了个地儿朝天
    本文内容整理自博学谷狂野架构师动态代理简介​ Proxy模式是常用的设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消......
  • ps 如何制作动态打字图?
     1.情景展示有几句话,想以打字的形式出现,而不是干巴巴的几个字,如何实现这个有趣的效果呢?2.解决方案第一步:录制屏幕:将想展示的文字逐字打出来--》保存;第二步:将录......
  • 异步注解@Async使用记录
    使用场景:需要执行某个方法但不需等待该方法的执行结果或者需要执行多个方法但这些方法不需要先后执行,可以通过声明并调用异步方法实现.因为每执行一个异步方法都需要从线......
  • SpringBoot常用注解大全
    常用注解概览这里整理了一张SpringBoot常用注解的思维导图,本文主要讲解这些注解的用法。 组件相关注解@ComponentScan默认扫描当前包及其子包下面被@component,@Cont......