2011-01-06 69 views
1

昨天Coobird的excellent answer之後,我無法使反射在Java中工作。我會先發布課程然後再詳細介紹。在Java中使用反射時無法投射

StHandler.java

package ds; public interface StHandler { 
public void read(); 
} 

DiStHandler.java

package ds; 
public class DiStHandler { 
public void read() { 
System.out.println("Hello world"); 
} 

Server.java

package ds; 
public class Server { 
public static void main(String[] args) { 
try { 
Class<?> clazz = Class.forName("ds.DiStHandler"); 
StHandler input = (StHandler) clazz.newInstance(); 
input.read(); 
} 
catch(Exception e) {} 
} 

我所試圖做的事:我有一個接口StHandler,這在我想要一個單一的方法:read()。 DiStHandler是一個可從類路徑中獲得的實現類。我試圖從這裏調用讀取方法。

問題:上線

StHandler input = (StHandler) clazz.newInstance(); 

我收到的錯誤:ds.DiStHandler cannot be cast to ds.StHandler

我一直在努力,現在調試這個了近兩個小時,但對我的生活不能工作了什麼問題是。我在DiStHandler中沒有implements StHandler的原因是因爲我在一個單獨的項目中創建了DiStHandler。

我將不勝感激這方面的任何建議。 在此先感謝非常多,

中號

回答

8

你不能投DiStHandlerStHandler如果DiStHandler沒有實現該接口。反射不會讓你顛覆類型系統 - 所有東西都必須是類型安全的。

如果DiStHandler無法實現StHandler,那麼你就需要別的東西哪呢,而且又調用DiStHandler(即適配器類)。

+0

嗯,我認爲是這樣 - 我想知道:如果我將接口類StHandler放入與DiStHandler相同的項目,並且讓DiStHandler實現,編譯,然後從生成的文件中獲取DiStHandler.class?非常感謝你的答覆。 :) – Myn 2011-01-07 10:03:11

0

你寫

The reason I don't have

DiStHandler實現StHandler

is because I'm creating DiStHandler in a separate project.

即使StHandler是在不同的項目,你仍然可以使用這個結構。事實上,拆分項目可能是一個很好的設計。如果是這樣,你應該看看諸如maven之類的工具來管理依賴關係 - 你的DiStHandler將在StHandler上依靠取決於。將maven放入工具鏈將在模塊化方面快速收回