接口:如何通过Java中的反射调用代理(Spring AOP)方法?
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.read(1L)
方面被调用。
然而,当我尝试做这样的(见readViaReflection)
ManagerImpl.class.getMethod("read", Long.class).invoke(manager, 1L);
得到java.lang.reflect.InvocationTargetException对象不是声明类的一个实例。
这是合理的。
的问题是:如何可以通过由弹簧创建代理对象上反射调用方法(I有方法从目标对象中提取和我有代理通过创建弹簧的实例)。
无法对目标执行调用,因为此时aspect不会调用。
为什么你需要这个丑陋的装置。我需要调用方法,而不是在接口中做错事情或者接口错误。如果你真的想这样做(我强烈建议不要),你需要切换到基于类的代理,而不是基于接口的代理。 –