2011-05-12 49 views
12

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

+1

這是不好的做法,實際實現類不應該是相關的。但是,這可能取決於您的代理是如何創建的。 – skaffman 2011-05-12 10:03:11

+0

如果您需要調用'ImplementationOfA'上的方法,然後將該方法添加到'InterfaceA'接口,或定義第二個接口並將該方法添加到該接口。 – skaffman 2011-05-12 10:32:14

+0

嗯,我知道這並不理想,但是我擴展的類實現了一個接口,並且由於應用程序的要求,我無法修改InterfaceA和NotMyClass。 – ssedano 2011-05-12 10:42:29

回答

0

基本上,當你在Spring中使用AOP時,Spring將爲你構建一個代理。你有兩個選擇:

  1. ,當你申請上實現接口豆方面,在 這種情況下,春季使用JdkDynamicProxy
  2. 當你的Spring bean沒有實現任何接口,如果你有 CGLIB 2.2在你的classpath中,考慮從spring 3.2.x開始你在默認情況下在spring容器中有 csplib,sprirng使用一個叫做CGLibProxy的特殊 代理。

關鍵的一點是聽到的是一個方面是應用在你的bean上Spring將實例化一個代理,如果你試圖執行一個轉換,你將會得到一個異常。

我希望塔這可以幫助你

4

對我來說版本從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);