#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())
}