美文网首页
aop & 反射 & 缓存

aop & 反射 & 缓存

作者: 川流不息attitude | 来源:发表于2023-05-19 16:43 被阅读0次

    aop & 反射 & 缓存

    有时候一些 公用属性,就想一个对象继承这个对象,这个对象里面的属性就自动赋值,这个时候就可以 用到反射(反射加上缓存 速度嘎嘎快,性能损耗微乎其微),那些方法需要赋值 用aop 切 就行。

    1. 第一步定义注解 和对应的 公共类
    @Target({ElementType.METHOD,ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface SetChannelConfig {
    }
    @Data
    public class Config {
    
        private String url;
    
        private String name;
    
        private Integer id;
    
        private Date date;
    }
    @Data
    public class Config01 extends Config{
    
        private String name;
    
    }
    
    2. 第二步定义 aop
    @Component
    @Aspect
    @Slf4j
    public class SetChannelConfigAop {
    
        /**
         * 注解切入点
         */
        @Pointcut("@annotation(SetChannelConfig) || @within(SetChannelConfig)")
        public void setChannelConfigPointCut(){
    
        }
    
        /**
         * 伪造假数据
         */
        Map<String,String> config = new HashMap<>();
        {
            config.put("url","wwww.baidu.com");
            config.put("name","123456");
            config.put("id","1");
            config.put("date","2023-05-20 16:22:52");
        }
        /**
         * 方法执行前执行
         *
         * @param joinPoint
         */
        @Around("setChannelConfigPointCut()")
        public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
    
            Object target = joinPoint.getTarget();
            Object[] args = joinPoint.getArgs();
            for (int i = 0; i < args.length; i++) {
                if(args[i] instanceof Config){
                    Object obj = args[i];
                    Class<?> aClass = obj.getClass();
                    long startTime = System.currentTimeMillis();
    
                    Field[] fields = ReflectUtil.getFields(aClass);
                    log.info("反射耗时 {}",System.currentTimeMillis()-startTime);
                    for (int j = 0; j < fields.length; j++) {
                        Field field = fields[j];
                        String name = field.getName();
                        String value = config.get(field.getName());
                        if(!StringUtils.isBlank(name)){
                            String upperCase = String.valueOf(name.charAt(0)).toUpperCase();
                            String substring = name.substring(1);
                            Class<?> type = field.getType();
                            ReflectUtil.invoke(obj,new StringBuilder("set").append(upperCase).append(substring).toString(), Convert.convert(type,value));
                        }
                    }
    
                }
            }
            return joinPoint.proceed();
        }
    }
    

    反射方法里面的缓存

    image.png image.png
    测试 ,通用属性注入完成
    image.png

    相关文章

      网友评论

          本文标题:aop & 反射 & 缓存

          本文链接:https://www.haomeiwen.com/subject/fiknsdtx.html