接口:
public interface Manager {
Object read(Long id);
}
实现此接口的类:
@Transactional
Public class ManagerImpl implements Manager {
@Override
public Object read(Long id) {
// Implementation here
}
}
ManagerImpl 的一个方面:
@Aspect
public class Interceptor {
@Pointcut("execution(public * manager.impl.*.*(..))")
public void executionAsManager() {
}
@Around("executionAsManager()")
public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
// Do some actions
return joinPoint.proceed();
}
}
一个控制器:
@RestController()
public class Controller {
@Autowired
private Manager manager;
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Object read(@PathVariable Long id) {
return manager.read(id);
}
@RequestMapping(value = "reflection/{id}", method = RequestMethod.GET)
public Object readViaReflection(@PathVariable Long id) {
return ManagerImpl.class.getMethod("read", Long.class).invoke(manager, id);
}
}
所以,当Spring在Controller代理中注入Manager变量时。
当直接调用方法时:
manager.read(1L)
触发了Aspect。
然而,当我尝试像这样做时(见readViaReflection)
ManagerImpl.class.getMethod("read", Long.class).invoke(manager, 1L);
收到“java.lang.reflect.InvocationTargetException”对象,它不是声明类的实例。这是合理的。
问题是:如何通过反射在由Spring创建的代理对象上调用方法(我从目标对象中提取了方法,并且我有由Spring创建的代理实例)。
无法在目标上执行调用,因为切面将不会调用。