переменная класса доступа в классе аспектов

#java #spring #jakarta-ee #aspectj #spring-aop

#java #весна #джакарта-ee #aspectj #spring-aop

Вопрос:

я создаю класс aspect с помощью spring aspectj следующим образом

 @Aspect
public class AspectDemo {
  @Pointcut("execution(* abc.execute(..))")
     public void executeMethods() { }

 @Around("executeMethods()")
    public Object profile(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("Going to call the method.");
            Object output = pjp.proceed();
            System.out.println("Method execution completed.");
            return output;
    }

} 
  

теперь я хочу получить доступ к имени свойства класса abc, а затем как получить доступ к нему в классе aspect?
я хочу отобразить свойство name класса abc в методе profile

мой класс abc выглядит следующим образом

 public class abc{
String name;

public void setName(String n){
name=n;
}
public String getName(){
 return name;
}

public void execute(){
System.out.println("i am executing");
}
}
  

Как я могу получить доступ к имени в классе aspect?

Ответ №1:

Вам нужно получить ссылку на целевой объект и привести его к вашему классу ( instanceof возможно, после проверки):

 Object target = pjp.getTarget();
if (target instanceof Abc) {
    String name = ((Abc) target).getName();
    // ...
}
  

Рекомендуемый подход (для обеспечения производительности и безопасности типов) заключается в том, чтобы указать цель, указанную в pointcut:

 @Around("executeMethods() amp;amp; target(abc)")
public Object profile(ProceedingJoinPoint pjp, Abc abc) ....
  

Но это будет соответствовать только исполнениям для цели типа Abc.

Ответ №2:

@Hemant

Вы можете получить доступ к объявленному типу и его полям из объекта proceduingjoint Point следующим образом:

 @Around("executeMethods()")
public Object profile(ProceedingJoinPoint pjp) throws Throwable {

    Class myClass = jp.getStaticPart().getSignature().getDeclaringType();
    for (Field field : myClass.getDeclaredFields())
    {
        System.out.println(" field : " field.getName() " of type " field.getType());
    }

    for(Method method : myClass.getDeclaredMethods())
    {
        System.out.println(" method : " method.toString());
    }
    ...
}
  

Поле и метод являются частью пакета java.lang.reflect

Ответ №3:

Если вы используете Spring, вы можете использовать вспомогательный класс AOPUtils

  public Object invoke(MethodInvocation invocation) throws Throwable
 {
      Class<?> targetClass = AopUtils.getTargetClass(invocation.getThis())
 }