2011-08-30 214 views
1

我有三個文件:Java類型鑄造

ScriptProcessor.java:

public interface ScriptProcessor { 
    public String someMethod(); 
} 

ScriptProcessorDummy.java:

public class ScriptProcessorDummy implements ScriptProcessor { 
    public String someMethod{ 
     return "some string"; 
    } 
} 

在main方法,該代碼執行以下操作:

URLClassLoader loader = null; 
loader = new URLClassLoader(new URL[] {new URL("JARFILE")}); 
if (loader != null) { 
    ScriptProcessor processor = (ScriptProcessor) loader.loadClass("ScriptProcessorDummy").newInstance(); 
} 

「JARFILE 「包含ScriptProcessor和ScriptProcessorDummy的類文件。

使用JDK 1.4時,代碼工作正常,但在使用JDK 1.5時,類型轉換(對ScriptProcessor)失敗,並返回java.lang.ClassCastException。

有人請告訴我如何解決這個問題。

感謝, 拉吉

+2

是什麼讓你認爲與泛型有任何關係? – Gabe

+0

添加一個Object類型的臨時變量,將newInstance的結果放入該變量中,並查看您在調試器中看到的內容。 – bmargulies

+0

@bmargulies:嗨,當我把newInstance的結果放入Object並打印obj.getClass()時,我得到了ScriptProcessorDummy。你能告訴我什麼是正確的方式來派生派生類的實例到相應的接口。 – Raj

回答

1

你需要讓你當前的類加載器成爲你正在加載的新類加載器的父類,並確保你的jar中沒有接口的副本。

您遇到的問題表明您有兩個接口副本:一個在主類加載器中,一個在新加載器中。返回的對象使用單獨的jar中的對象,但是您的類正在使用主類。他們不一樣。在處理加載的類時,必須確保Java在接口上使用相同的'.class',就像編譯代碼時一樣。

要做的第一件事就是在罐子上'jar tf',看看我的兩個副本的假設是否正確。如果是這樣,請將其刪除。嘗試運行。如果你現在得到一個NoClassDef,修復裝載機的結構。

new URLClassLoader(urlArray, Thread.currentThread().getContextClassLoader()); 

假設您的環境維護上下文類加載器。或者,

new URLClassLoader(urlArray, ScriptProcessor.class.getClassLoader()); 
+0

感謝您的幫助。當我刪除ScriptProcessor.class文件(這是接口)時,我得到一個NoClassDef異常。你能告訴我如何修復裝載機的結構。 – Raj

+0

@Raj見編輯.. – bmargulies

+0

非常感謝。 – Raj

0

嘗試使用:

loader.loadClass("ScriptProcessorDummy", true).newInstance(); 

布爾告訴classloader來查找類名。

+0

當我嘗試這樣做時,出現以下編譯錯誤:loadClass(java.lang.String,boolean)在java.lang.ClassLoader中保護訪問 – Raj