Come posso ottenere l'annotazione da passare come argomento per l'avviso definito per l'annotazione a livello di classe ? È possibile?@AspectJ Avviso annotazione a livello di classe con annotazione come argomento metodo
Dal post here Sono in grado di ottenere il punto di taglio che identifica tutto il metodo pubblico nella classe che è contrassegnato da una specifica annotazione. Sono in grado di ottenere il consiglio applicato pure. Tuttavia, non so come ottenere la variabile di annotazione passata come argomento nel caso precedente.
Per un'annotazione a livello di metodo, sono in grado di ottenere il punto e il consiglio in cui posso ottenere l'annotazione passata come argomento, ma non so come ottenere lo stesso per l'annotazione a livello di classe.
Il codice sotto funziona, ma ho bisogno di ottenere l'annotazione come argomento per il consiglio “LogExecutionTimeByClass” in programma qui sotto e non ho potuto in grado di ottenere consulenza o pointcut appropriata per lo stesso.
della nota:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
String level();
}
Aspetto:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class LogTimeAspect {
/*
* Pointcut to match all the public methods.
*/
@Pointcut("execution(public * *(..))")
public void publicMethod() {}
/*
* Advice for the public methods that are marked with Annotation "LogExecutionTime" and it works as expected no issue.
*/
@Around("publicMethod() && @annotation(annotation) ")
public Object LogExecutionTimeByMethod(final ProceedingJoinPoint joinPoint,final LogExecutionTime annotation) throws Throwable
{
System.out.println("Invoking the method " +joinPoint.getSignature() +" by LogExecutionTimeByMethod Advice");
return joinPoint.proceed();
}
/*
* Pointcut to match all the public methods that are defined under the Class marked with Annotation LogExecutionTime.
*/
@Pointcut("within(@LogExecutionTime *)")
public void beanAnnotatedWithMonitor() {}
@Pointcut("publicMethod() && beanAnnotatedWithMonitor()")
public void publicMethodInsideAClassMarkedWithAtMonitor() {}
/*
* Below Advice works but I need the LogExecutionTime annotation as an argument to below method. (similar to the advice "LogExecutionTimeByMethod"
* defined above)
*/
@Around("publicMethodInsideAClassMarkedWithAtMonitor()")
public Object LogExecutionTimeByClass(final ProceedingJoinPoint joinPoint) throws Throwable
{
System.out.println("Invoking the method " +joinPoint.getSignature() +" by LogExecutionTimeByClass Advice");
//System.out.println("Invoked by " + annotation.value()); //Need the Annotation Variable here as well...
return joinPoint.proceed();
}
/*
*/
}
Annotated Classe:
@LogExecutionTime(level="Class_Level_Invocation")
public class Operator {
@LogExecutionTime(level="Method_Level_Invocation")
public void operate() throws InterruptedException {
Thread.sleep(1000);
}
public void operate1() throws InterruptedException {
Thread.sleep(1000);
}
}
programma principale:
public class AspectJMain {
public static void main(String[] args) throws InterruptedException {
Operator op = new Operator();
op.operate();
op.operate1();
}
}
uscita:
Invoking the method void Operator.operate() by LogExecutionTimeByMethod Advice
Invoking the method void Operator.operate() by LogExecutionTimeByClass Advice
Invoking the method void Operator.operate1() by LogExecutionTimeByClass Advice
Si prega di notare che l'utilizzo di primavera è non è un'opzione. Devo usare il compilatore AspectJ. Ho compilato le mie classi e le ho impacchettate come jar e ho usato il compilatore ApsectJ per tessere l'aspetto usando il comando below.
ajc -inpath core.jar -outjar .. \ lib \ core_woven.jar -1.5
Qualsiasi puntatore sarebbe utile.
Grazie. Fammi provare. La ragione per Around è ottenere il tempo di esecuzione del metodo. – param83
Ho provato ma non sono riuscito a passare l'argomento dell'annotazione tramite all'interno ma sotto il punto di taglio works @Pointcut ("publicMethod() && beanAnnotatedWithMonitor() && @annotation (annotation)") – param83
Non hai davvero bisogno di 'beanAnnotatedWithMonitor()', vedere il mio aggiornamento sopra. – kriegaex