Parameters AspectJ/Java插装用于拦截注释参数调用/使用

Parameters AspectJ/Java插装用于拦截注释参数调用/使用,parameters,annotations,aspectj,pointcut,Parameters,Annotations,Aspectj,Pointcut,我想知道当使用param1(param定义并在TestClassGeneralMeasurements类的方法上使用)时,如何调用doMonitorization方法,该类具有正确的注释,具有拦截AspectJ定义,如下面的代码所示 package monitorization; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotat

我想知道当使用param1(param定义并在TestClassGeneralMeasurements类的方法上使用)时,如何调用doMonitorization方法,该类具有正确的注释,具有拦截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("");
        }
    }
}
/////////////////////////////////////////////////

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("");
        }
    }
}
包装监控;
公共类TestClassGeneralMeasurements{
@莫尼托姆(20)
int字段;
@莫尼托姆(50)
int field2;
@莫尼托姆(5)
public void simpleTestMethod(@Monitorme(10)字符串参数1){
此字段=1;
此字段=3;
该字段=4;
参数1=“”;
}
@莫尼托姆(30)
public void simpleTestMethod2(@Monitorme(10)字符串参数1){
这个字段2=1;
这个字段2=1;
参数1=“”;
}
公共静态void main(最终字符串[]args){
long intialTimeStamp=System.currentTimeMillis();
System.out.println(“启动”);
TestClassGeneralMeasurements testObject=新TestClassGeneralMeasurements();

对于(长i=0;iAspectJ
@annotation
切入点不能匹配参数上的注释,只能匹配参数类型,即不能匹配

public foo(@MyAnnotation MyType foo)
但你只能在

public foo(MyType foo)
如果类
MyType
@MyAnnotation
注释


AspectJ邮件列表中已经讨论过这一点,这是愿望列表中的一项功能,目前尚未实现。

非常感谢您的回答,AspectJ应该实现这一功能,这将有所不同。谢谢@kriegaex!