AspectJ / Java检测器拦截带注释的参数调用/用法

时间:2013-05-29 09:46:38

标签: parameters annotations aspectj pointcut

我想知道如何在使用param1时调用doMonitorization方法(param在TestClassGeneralMeasuraments类的方法上定义并使用),该方法具有正确的注释,具有拦截AspectJ定义,如下面的代码所示。

package monitorization;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AspectJInterceptor {
    @Pointcut(value = "@annotation(monitorme)", argNames = "monitorme")
    public void monitorActivity(Monitorme monitorme) {}

    @After("monitorActivity(monitorme)")
    public void doMonitorization(JoinPoint jp, Monitorme monitorme) {
        MetricsDataStructure.staticInstance.addOperation(jp.getSignature().toLongString(), monitorme.value());
    }
}

/////////////////////////////////////////////// //

package monitorization;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Monitorme {
    int value();
}

/////////////////////////////////////////////// //

package monitorization;

public class TestClassGeneralMeasuraments{
    @Monitorme(20)
    int field;
    @Monitorme(50)
    int field2;

    @Monitorme(5)
    public void simpleTestMethod(@Monitorme(10) String param1){
        this.field = 1;

        this.field = 3;

        this.field = 4;

        param1 = "";
    }

    @Monitorme(30)
    public void simpleTestMethod2(@Monitorme(10) String param1){
        this.field2 = 1;
        this.field2 = 1;
        param1 = "";
    }

    public static void main(final String[] args){
        long intialTimeStamp = System.currentTimeMillis();
        System.out.println("Starting up");
        TestClassGeneralMeasuraments testObject = new TestClassGeneralMeasuraments();
        for(long i=0; i<50; i++)
        {
            testObject.simpleTestMethod("Hey");
            testObject.simpleTestMethod("Hey");
            testObject.simpleTestMethod2("");
        }
    }
}

1 个答案:

答案 0 :(得分:2)

AspectJ @annotation切入点无法匹配参数上的注释,只能匹配参数类型,即无法匹配

public foo(@MyAnnotation MyType foo)

但你只能匹配

public foo(MyType foo)

如果MyType注释了课程@MyAnnotation

这已在AspectJ邮件列表中进行了讨论,并且是目前尚未实施的愿望清单上的一项功能。