2013-12-11 116 views
4
  • ,我讀了配置文件的完整的類名
    • 如:org.abcDefaultHandler
  • 這個類實現了一個名爲「處理程序」
  • 方法
  • 我用Java反射來調用 「處理程序」執行被Java反射創建的對象的Java接口

    Class cls = Class.forName("org.a.b.c.DefaultHandler"); 
    handlerObj = cls.newInstance(); 
    method = cls.getMethod("handler", cArg); 
    method.invoke(handlerObj, service); 
    

類的樣子:

public class DefaultHandler { 

    public void handler(String service) throws Exception { 
     ... 
    } 

} 

我需要確保任何*Handler Class實現"handler"方法。如果我做類似

public class DefaultHandler implements handlerInterface { 
    ... 
} 

它沒有多大用處,因爲編譯器無法幫助我使用反射。

所以,我怎麼能強制在調用/創建在Java反射的類的實例的接口????

+0

我不明白你的問題。 )像這樣'handlerObj = cls.newInstance(創建的對象;'不大於像'新org.a.b.c.DefaultHandler()'在您的示例創建的對象不同。 –

+1

由於反射,自然和定義,運行時工具,我不相信你可以強制執行相關的類定義,這是一個編譯時需要什麼。 – afsantos

回答

3

你不能這樣做在編譯時強制執行,這是一個handlerInterface什麼,因爲反射本質上是一個運行時的活動。

你能做的最好的就是投它作爲你的接口handlerInterface。如果不是,則會拋出ClassCastException,您可以正確處理。

try { 
    handlerInterface handler = (handlerInterface) handlerObj; 
} catch (ClassCastException e) { 
    // Handle appropriately 
} 
+0

感謝澄清。 – GJain

1

檢查方法簽名;該代碼(可以理解)沒有檢查太多:通常會打電話給getConstructor().newInstance(),例如,可能的例外情況。

如果有一個接口,這樣做:

if (!HandlerInterface.class.isAssignableFrom(cls)) { 
    // Error 
} 
1

你可以使用泛型做:

Class<handlerInterface> cls = Class.forName("org.a.b.c.DefaultHandler"); 
handlerInterface handlerObj = cls.newInstance(); 

與投ClassCastException最後一行,如果它不implements handlerInterface,你可以適當的處理。