2011-01-14 130 views
1

我第一次使用java.util.concurrency框架。這是我正在做的一個非常簡化的版本。對於那些不熟悉該框架的人,future.get()執行將來定義的對象Callablefuture.getOriginatingRequest()返回一個我將來設置的對象,供Callable對象使用,我只是試圖記錄哪個始發請求對象失敗(它足以知道它的類名)。如何獲取代理類的名稱?

try { 
    future.get(); 
} catch (ExecutionException e) { 
    logger.error("Failed to execute future with id '" + 
      future.getOriginatingRequest().getClass().getName() + "'"); 
} 

我遇到的問題是,日誌框架輸出這樣的:

Failed to execute future with id '$Proxy22' 

因此而不是真正的類名我得到$Proxy22或其他一些數字。有沒有辦法獲得真實的類名而不是代理名?積分是有人可以清楚地解釋爲什麼我首先得到代理字符串!

回答

2

我可以回答獎勵問題:字符串是在運行時生成的動態Proxy類的名稱。

至於怎樣才能到達被蒙面的班級,甚至根本沒有保證。您唯一能做的就是在您的代理對象上調用Proxy.getInvocationHandler(),並希望調用處理程序將顯示更多信息(不太可能,但可能值得一試)。

+0

感謝。任何想法爲什麼一個代理類參與?他們是爲了什麼?畢竟我在未來(我自己創建的)上設置了始發請求對象,並且只是試圖恢復它。 –

+0

@Chris Knight你使用RMI還是類似的東西? – josefx

+0

@Chris Knight使用代理可能有幾個原因,但它通常涉及在每個方法調用之前和/或之後執行的操作(例如訪問檢查)或能夠操作(或替換)沒有任何人注意到它的底層對象。但是動態代理非常強大且多功能,所以它可能是完全不同的東西。 – biziclop

-1

我猜測代理類是你正在尋找的類的子類。特別是如果你正在尋找的課程是你寫的課程。

你能訪問你找到的對象的繼承樹嗎?也許通過反思?

+0

Among其他的東西,動態代理被用來防止這種篡改。 – biziclop

+0

嗯,也許不是..不太確定了。無論如何,這裏猜測stackoverflow D: – davogotland

+0

好主意(我認爲),但不適合我:這是我的輸出:類:$ Proxy22 超級類:java.lang.reflect.Proxy 超級超類:java .lang.Object –

1

我覺得適合我的解決方案上http://www.techper.net/2009/06/05/how-to-acess-target-object-behind-a-spring-proxy/

@SuppressWarnings({"unchecked"}) 
protected <T> T getTargetObject(Object proxy, Class<T> targetClass) throws Exception { 
    if (AopUtils.isJdkDynamicProxy(proxy)) { 
    return (T) ((Advised)proxy).getTargetSource().getTarget(); 
    } else { 
    return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class 
    } 
} 

使用

@Override 
protected void onSetUp() throws Exception { 
    getTargetObject(fooBean, FooBeanImpl.class).setBarRepository(new MyStubBarRepository()); 
}