2013-12-19 23 views
1

我想在java中進行自動錯誤處理。其他人可以調用我的錯誤處理方法,併爲它們處理錯誤。我試圖擁有它,所以如果調用我的方法的類有一個close()方法,我可以調用它,它會關閉所有防止資源泄漏的東西。我想是這樣的:調用尚不存在的方法java

public void logError(Error e, Object obj){ 
    obj.close(); 
} 

唯一的問題是,這將無法運行,因爲在默認情況下對象沒有一個close()方法。我可以創建自己的對象並讓他們的類擴展它,但如果他們想要擴展一個不同的類,它將不起作用。

+4

如果你真的想要這樣做,那麼你應該檢查Reflection(http://docs.oracle.com/javase/tutorial/reflect/)。 – skiwi

+3

您可以創建一個接口,任何想要使用logError方法的類都必須實現該接口。 – OldProgrammer

+1

我不認爲這會是一個好主意。如果你真的想,看看反射。 – zapl

回答

5

您需要的接口:

interface Closeable { 
    public void close(); 
} 

否則,你可以通過反射檢查對象。

+0

我將如何使方法的參數需要實現可關閉。我嘗試了public void logError(Error e,Closeable obj),但只是期望類擴展Closeable – user2628615

+0

如果Closeable是一個接口,那麼它會期望一個類實現接口。如果期望延伸Closeable的東西,那麼你的Closeable不是一個接口,而是一個類。 –

+1

'Closeable' * *已經是一個接口。所以我不會建議定義你自己的,而是使用已經定義好的。 – skiwi

1

我認爲如果您關閉日誌記錄方法中的資源,那麼您會遇到設計問題。正如其他人所提到的,使用一個接口並處理關閉其他地方的資源。

如果你真的想繼續這種方法,你需要使用反射。下面的invoke調用會拋出一些你需要捕捉的異常。

public void logError(Error e, Object obj) 
{ 
    Method closeMethod = obj.getClass().getMethod("close", null) 
    if (closeMethod != null) 
     closeMethod.invoke(obj, null); 
0

您可以使用下列內容:

public void logError(Error e, Closeable obj) { 
    //do your logging 
    obj.close(); 
} 

public void logError(Error e, Object obj){ 
    //do your logging 
    Method closeMethod = obj.getClass().getMethod("close", null); 
    if (closeMethod != null) { 
     //log that the method has a .close() method, but does NOT implement Closeable 
    } 
} 

這將確保第一你的日誌將嘗試關閉Closeable對象。如果失敗了,它將回落到一般的Object實施。我在這裏增加了反射只有做了額外的日誌記錄,在這裏並不需要使用反射,我認爲你不應該在而不是實現Closeable的對象上手動調用close()

對於方法重載的優先級是指:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2

答案應該工作,因爲任何物體更具體爲Object,只要它增加了東西的功能。