2013-05-29 2 views
0

Я хотел бы знать, как метод doMonitorization может вызываться при использовании параметра param1 (параметр, определенный и используемый для методов класса TestClassGeneralMeasuraments), который имеет правильную аннотацию который имеет определение AspectJ перехвата, как показано ниже.Инструмент AspectJ/Java для перехвата вызова/использования аннотированного параметра

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(""); 
     } 
    } 
} 

ответ

2

AspectJ @annotation не срезов в соответствуют аннотаций по параметрам, только по типам параметров, т.е. вы не можете соответствовать на

public foo(@MyAnnotation MyType foo) 

но вы можете сопоставить только на

public foo(MyType foo) 

если класс MyType помечается на @MyAnnotation.

Это обсуждалось в списке рассылки AspectJ и является функцией в списке пожеланий, который до сих пор не реализован.

+0

Большое спасибо за ответ, и AspectJ должен реализовать эту функцию, это будет иметь значение. Спасибо @kriegaex! – Axel

Смежные вопросы