복붙노트

[SPRING] 애스펙트 클래스의 클래스 변수 액세스

SPRING

애스펙트 클래스의 클래스 변수 액세스

나는 봄 aspectj와 함께 aspect 클래스를 다음과 같이 생성한다.

@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 클래스에서 액세스하는 방법을 원하십니까? 내가 프로필 메서드에 abc 클래스의 이름 속성을 표시하고 싶습니다.

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

애스펙트 클래스의 이름에 어떻게 액세스 할 수 있습니까?

해결법

  1. ==============================

    1.대상 객체에 대한 참조를 가져 와서 클래스에 캐스팅해야합니다 (instanceof 검사 후).

    대상 객체에 대한 참조를 가져 와서 클래스에 캐스팅해야합니다 (instanceof 검사 후).

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

    권장되는 접근법 (성능 및 유형 안전성을 위해)은 pointcut에 언급 된 대상을 갖는 것입니다.

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

    그러나 이것은 Abc 유형의 대상에 대한 실행 만 일치시킵니다.

  2. ==============================

    2.@ 인 Hemant

    @ 인 Hemant

    다음과 같이 ProceedingJointPoint 객체에서 선언 유형 및 해당 필드에 액세스 할 수 있습니다.

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

    Field & Method는 java.lang.reflect 패키지의 일부입니다.

  3. ==============================

    3.Spring을 사용한다면 AOPUtils 헬퍼 클래스를 사용할 수 있습니다.

    Spring을 사용한다면 AOPUtils 헬퍼 클래스를 사용할 수 있습니다.

     public Object invoke(MethodInvocation invocation) throws Throwable
     {
          Class<?> targetClass = AopUtils.getTargetClass(invocation.getThis())
     }
    
  4. from https://stackoverflow.com/questions/7819410/access-class-variable-in-aspect-class by cc-by-sa and MIT license