我正在使用Spring,我希望将该对象转换为其实际的运行时实现。将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。
EDIT 1 我延伸的类和我需要在ImplementationOfA
调用一种方法。所以我认为我需要演员。该方法接收一个参数。
EDIT 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/ 谢谢!
这是不好的做法,实际实现类不应该是相关的。但是,这可能取决于您的代理是如何创建的。 – skaffman 2011-05-12 10:03:11
如果您需要调用'ImplementationOfA'上的方法,然后将该方法添加到'InterfaceA'接口,或定义第二个接口并将该方法添加到该接口。 – skaffman 2011-05-12 10:32:14
嗯,我知道这并不理想,但是我扩展的类实现了一个接口,并且由于应用程序的要求,我无法修改InterfaceA和NotMyClass。 – ssedano 2011-05-12 10:42:29