輸入java.lang.annotation.ElementType。 輸入java.lang.annotation.Retention。 輸入java.lang.annotation.RetentionPolicy。 輸入java.lang.annotation.Target; / ** *定义一个挡板 * / @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) パブリック @のインタフェースBaffleAn { }
輸入javassist.ClassClassPath。 輸入javassist.ClassPool。 輸入javassist.CtClass。 輸入javassist.CtMethod。 輸入javassist.bytecode.CodeAttribute。 輸入javassist.bytecode.LocalVariableAttribute。 輸入javassist.bytecode.MethodInfo; / ** *挡板切面类 * / @EnableAspectJAutoProxy @Component @Aspect パブリック クラスBaffleAnAspect { @Pointcut( "@Annotation(BaffleAn)" ) 公共 ボイドポイント(){} @Around( "点()" ) 公衆周りのオブジェクト(ProceedingJoinPoint点)スローのThrowableが{ 戻りBaffleAnService.handler(点)。 } パブリック 静的地図の<string、オブジェクト> getFieldsNameValueMap(ジョインポイントジョインポイント)をスロー例外{ オブジェクトは[]引数の =のjoinPoint.getArgsを(); ストリングするClassType = 。。joinPoint.getTarget()のgetClass()のgetName()。 クラス <?> clazz = Class.forNameの(するClassType)。 ストリングclazzName = clazz.getName()。 文字列methodNameの = joinPoint.getSignature()のgetName()。// 获取方法名称 地図<文字列、オブジェクト>マップ= 新しい HashMapの<文字列、オブジェクト> (); ClassPoolプール = ClassPool.getDefault()。 ClassClassPathのclassPath = 新しい ClassClassPath(BaffleAnAspect。クラス); 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)。 もし(ATTR == nullの){ スロー 新しいのRuntimeExceptionを(); } int型の POS = Modifier.isStatic(cm.getModifiers())?0:1 。 以下のために(int型 i = 0; iは()の長さcm.getParameterTypesを<; iは++ ){ map.put(attr.variableName(I + POS)、引数[I])。// paramNames即参数名 } リターンマップ。 } }
輸入java.util.Map; 輸入org.aspectj.lang.ProceedingJoinPoint。 / ** * 挡板处理类 * / パブリック クラスBaffleAnService { パブリック 静的オブジェクト・ハンドラ(ProceedingJoinPoint点)がスローされたThrowable { オブジェクトOBJ = ヌル。 マップの<string、オブジェクト>マップ= BaffleAnAspect.getFieldsNameValueMap(点) もし(マップ== NULL ){ OBJ = point.proceed()。 返すOBJを。 } であれば(map.containsKey( "AA")){ // フラッパーサービス処理 } OBJ = point.proceed(); 戻りOBJを; } }