我正在使用Spring,我希望将对象强制转换为实际的运行时实现。
示例:
Class MyClass extends NotMyClass {
InterfaceA a;
InterfaceA getA() { return a; }
myMethod(SomeObject o) { ((ImplementationOfA) getA()).methodA(o.getProperty()); }
}
由于ClassCastException
是a
对象,因此大喊$ProxyN
。虽然在beans.xml中我注入了一个类ImplementationOfA
的bean。
编辑1
我扩展了一个类,我需要在ImplementationOfA
中调用一个方法。所以我想我需要施展。该方法接收参数。
编辑2
我最好扯掉目标类:
private T getTargetObject(Object proxy, Class targetClass) throws Exception {
while( (AopUtils.isJdkDynamicProxy(proxy))) {
return (T) getTargetObject(((Advised)proxy).getTargetSource().getTarget(), targetClass);
}
return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
}
我知道它不是很优雅但是很有效。
http://www.techper.net/2009/06/05/how-to-acess-target-object-behind-a-spring-proxy/的所有积分 谢谢!
答案 0 :(得分:8)
你为什么要演员? 关于Spring proxy usage this is a great article,我建议您阅读,评论。
还有来自Spring AOP documentation的代理(7.1.3)部分。
答案 1 :(得分:7)
对于我来自 EDIT 2 的版本没有用。下面有一个工作:
@SuppressWarnings({"unchecked"})
protected <T> T getTargetObject(Object proxy) throws Exception {
while( (AopUtils.isJdkDynamicProxy(proxy))) {
return (T) getTargetObject(((Advised)proxy).getTargetSource().getTarget());
}
return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
}
用法:
UserServicesImpl serviceImpl = getTargetObject(serviceProxy);
serviceImpl.setUserDao(userDAO);
答案 2 :(得分:3)
现在您可以使用
AopTestUtils.getTargetObject(proxy)
。
实现与@siulkilulki建议相同,但在Spring帮助程序上
答案 3 :(得分:0)
基本上,当你在Spring中使用AOP时,Spring会为你构建一个代理。你有两个选择:
关键点是,在你的bean上应用了一个方面Spring将实例化一个代理,如果你尝试执行一个转换,你将得到一个异常。
我希望这可以帮到你