1
這裏是我的自定義註解AnnoLogExecTime
和AOP
類:爲什麼匿名類方法調用方法時不能執行aop?
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnnoLogExecTime {
}
@Aspect
@Service
public class AOP {
Logger logger = LoggerFactory.getLogger(AOP.class);
@Around("execution(@com.judking.general.aop.AnnoLogExecTime * *(..))")
public Object calExecTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
Method method = signature.getMethod();
long t1 = System.currentTimeMillis();
Object obj = proceedingJoinPoint.proceed();
long t2 = System.currentTimeMillis();
logger.info("method `"+method.getName()+"` takes "+(t2-t1)+"ms");
return obj;
}
}
而且測試用例如下:
@Service
class A {
public void go() {
B b = new B() { //Anonymous class B
@Override
public void exec() {
aopMethod();
}
};
b.exec();
}
@AnnoLogExecTime
public void aopMethod() {
System.out.println("aopMethod");
}
}
@Service
class B {
public void exec() {
System.out.println("exec");
}
}
當我打電話a.aopMethod()
,該AOP.calExecTime
是迷上了a.aopMethod()
。
但如果我叫a.go()
,這是使用匿名類B
實例調用a.aopMethod()
,那麼AOP.calExecTime
是不迷上了a.aopMethod()
。
任何人都可以給我一個這種現象的解釋嗎?在匿名課堂上,請給我一種解決這個問題的方法。非常感謝!