• spring aop 一个挡板例子


    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * 定义一个挡板
     */
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface BaffleAn {
    
    }
    import javassist.ClassClassPath;
    import javassist.ClassPool;
    import javassist.CtClass;
    import javassist.CtMethod;
    import javassist.bytecode.CodeAttribute;
    import javassist.bytecode.LocalVariableAttribute;
    import javassist.bytecode.MethodInfo;
    
    
    /**
     * 挡板切面类
     */
    @EnableAspectJAutoProxy
    @Component
    @Aspect
    public class BaffleAnAspect {
    
        @Pointcut("@annotation(BaffleAn)")
        public void point() {}
        
        @Around("point()")
        public Object around(ProceedingJoinPoint point) throws Throwable {
            return BaffleAnService.handler(point);
        }
        
        public static Map<String,Object> getFieldsNameValueMap(JoinPoint joinPoint) throws Exception {   
            Object[] args = joinPoint.getArgs();
            String classType = joinPoint.getTarget().getClass().getName();    
            Class<?> clazz = Class.forName(classType);    
            String clazzName = clazz.getName();    
            String methodName = joinPoint.getSignature().getName(); //获取方法名称   
            Map<String,Object > map=new HashMap<String,Object>();  
            ClassPool pool = ClassPool.getDefault();    
            ClassClassPath classPath = new ClassClassPath(BaffleAnAspect.class);    
            pool.insertClassPath(classPath);    
            CtClass cc = pool.get(clazzName);    
            CtMethod cm = cc.getDeclaredMethod(methodName);    
            MethodInfo methodInfo = cm.getMethodInfo();  
            CodeAttribute codeAttribute = methodInfo.getCodeAttribute();    
            LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);    
            if (attr == null) {    
                throw new RuntimeException();
            }    
            int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;    
            for (int i = 0; i < cm.getParameterTypes().length; i++){    
                map.put( attr.variableName(i + pos),args[i]);//paramNames即参数名    
            }    
            return map;    
        }    
    }
    import java.util.Map;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    /**
     * 
        挡板处理类
     */
    public class BaffleAnService {
    
        public static Object handler(ProceedingJoinPoint point) throws Throwable {
            Object obj=null;
            Map<String,Object> map=BaffleAnAspect.getFieldsNameValueMap(point);
            if(map == null) {
                obj=point.proceed();
                return obj;
            }
            if(map.containsKey("AA")) {
                //挡板业务处理
            }
            obj=point.proceed();
            return obj;
            
        }
    }
  • 相关阅读:
    次小生成树
    乘法逆元(递推)
    乘法逆元(快速幂)
    带偏移量的并查集
    Tarjan 强连通分量
    Luogu_P2461 [SDOI2008]递归数列 【题解】 矩阵乘法
    Luogu_P2243 电路维修【题解】 双端队列bfs
    Luogu_ P2962 [USACO09NOV] 灯 【题解】 双向搜索
    luogu_P2044【题解】 随机数生成器 矩阵乘法
    luogu_P2054 bzoj 1965 洗牌 【题解】 快速幂 快速乘
  • 原文地址:https://www.cnblogs.com/huzi007/p/11481868.html
Copyright © 2020-2023  润新知