一个接口:
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 在创建的控制器代理中注入 manager 变量时。
直接调用方法时:
manager.read(1L)
方面被调用。
但是,当我尝试这样做时(请参阅readViaReflection)
ManagerImpl.class.getMethod("read", Long.class).invoke(manager, 1L);
得到java.lang.reflect.InvocationTargetException对象不是声明类的实例。
这是合理的。
问题是:如何通过spring创建的代理对象的反射调用方法(我有从目标对象中提取的方法,并且我有spring创建的代理实例)。
不能对目标进行调用,因为这样就不会调用方面。