シャッターばねAOPの例

輸入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を; 
        
    } 
}

 

おすすめ

転載: www.cnblogs.com/huzi007/p/11481868.html