2012-03-03 50 views
0

注意:我對編程不是很熟悉,我希望你不介意我對術語的不正確使用。 :-)爲什麼遠程加載類時會出現IllegalAccessError?

我嘗試遠程加載類。看起來該類可以正確下載並啓動,但在調用其中一個方法時會出現IllegalAccessError錯誤。這是我在本地做的,這個工作100%沒有錯誤。

(Parent) instance = (Parent)Class.forName("somepackage.ChildClass").newInstance(); 
instance.callSomeMethod(); 

這就是我做的遠程加載它。這給出了一個IllegalAccessError,更具體 「試圖從類ChildClass訪問現場Parent.field」

URLClassLoader classLoader = new URLClassLoader(new URL[] { new URL("http://mysite.com/classes/") }); 
(Parent) instance = (Parent)classLoader.loadClass("somepackage.ChildClass").newInstance(); 
instance.callSomeMethod(); 

也請注意,所有的本地類是相同的遠程/互聯網的人,而我不希望下載並將該文件保存到我的類路徑中。

回答

0

我認爲,如果你使用不同的類加載器,然後子類實際上可能沒有父母的一個實例。所以,如果你在一個類加載器中加載了Parent並且在另一箇中加載了Child,那麼如果子類與另一個類加載器的父對象一起工作,它可能會導致你的問題。

請考慮這個答案有些懷疑,因爲我不確定它是否適用於您的情況(這將有助於查看失敗的方法的詳細信息以及無法訪問的字段的聲明) 。

0

的IllegalAccessError發生在你的代碼(一些如何)試圖訪問一個字段或調用訪問修飾符說你不能這樣做的方法。

通常情況下,當您嘗試做到這一點得到了Java編譯錯誤。但現在看來,你的「遠程加載」是做圍繞靜態檢查結束運行...

我能想到的兩種可能的解釋,但它是很難分辨他們沒有更多的信息;例如實際代碼和實際蹤跡。

  • 您可以遠程加載與本地不同的類的一個版本,並且您嘗試使用的方法/字段具有不同的訪問權限。 (你不能以這種方式破壞編譯器的訪問檢查......這就是你真正想要做的。)

  • 你可能在你的JVM中有類的本地和遠程拷貝。這裏的問題是,從類型系統的角度來看,這兩個版本將是不同的類。 (是的,兩個具有相同FQN的不同類,甚至可能是相同的代碼。)這可能會導致訪問問題。

我更傾向於認爲這是第一個問題,因爲我覺得第二個會表現爲一個IllegalAccessException而非IllegalAccessError

相關問題