[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.대상 객체에 대한 참조를 가져 와서 클래스에 캐스팅해야합니다 (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.@ 인 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.Spring을 사용한다면 AOPUtils 헬퍼 클래스를 사용할 수 있습니다.
Spring을 사용한다면 AOPUtils 헬퍼 클래스를 사용할 수 있습니다.
public Object invoke(MethodInvocation invocation) throws Throwable { Class<?> targetClass = AopUtils.getTargetClass(invocation.getThis()) }
from https://stackoverflow.com/questions/7819410/access-class-variable-in-aspect-class by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring에서 Excel 다운로드 가능 파일 반환 (0) | 2019.03.29 |
---|---|
[SPRING] 방법 - Spring IoC 및 HttpClient 4.3.1 CloseableHttpClient? (0) | 2019.03.29 |
[SPRING] Quartz Scheduler : 모든 클러스터 노드에서 일부 작업을 트리거하고 클러스터마다 한 번만 트리거합니다. (0) | 2019.03.29 |
[SPRING] Spring 4에서 register-defaults = "false"와 같은 것은 무엇입니까? (0) | 2019.03.29 |
[SPRING] 스프링 보안 로그 아웃이 j_spring_security_logout으로 이동합니다. (0) | 2019.03.29 |