我正在使用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