Parameters AspectJ/Java插装用于拦截注释参数调用/使用
我想知道当使用param1(param定义并在TestClassGeneralMeasurements类的方法上使用)时,如何调用doMonitorization方法,该类具有正确的注释,具有拦截AspectJ定义,如下面的代码所示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
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!