UPDATE:斯卡拉對象與Java Class.newInstance鬥爭()
我有所解決了這個問題。以防萬一,如果有人在同一個問題中運行,這裏是最簡單的解決方案:查看MTApplcation源代碼,我發現initialize()
方法可以被重載,併爲需要實例化的類的名稱提供String參數。所以,如果我創建一個擴展MTApplication的單獨類並將其名稱傳遞給它,那麼一切正常。 UPDATE
的
結束時,我有一種情況,斯卡拉試圖使用一個Java庫(MT4j,這是基於處理)。圖書館要實例化的主類的應用程序(呼叫者級)的:
Class<?> c = Thread.currentThread().getContextClassLoader().loadClass(name);
applet = (PApplet) c.newInstance();
從而爲以後指它在它的作品。
但是,它失敗了,因爲我猜,主Scala類不是一個類,而是一個對象,並且由於庫結構,有必要調用主庫類MTApplication
的靜態方法initialize()
。在Java中,靜態字段位於類中,但位於Scala中 - 位於對象中。所以實例化對象並且庫失敗是不可能的。與MT4j相比,Processing本身在啓動時不會調用靜態方法,並且成功通過該階段。
如果我只創建一個同伴類,一切正常,除了同伴類不會被初始化,它的領域,因爲靜態initialize()
方法被稱爲伴侶對象精細,類實例只是得到死者出生和庫變得不可用。
至少這是我的理解這個問題。
我得到這個錯誤:
Exception in thread "main" java.lang.RuntimeException: java.lang.IllegalAccessException: Class processing.core.PApplet can not access a member of class main.Main$ with modifiers "private"
at processing.core.PApplet.runSketch(PApplet.java:9103)
at processing.core.PApplet.main(PApplet.java:9292)
at org.mt4j.MTApplication.initialize(MTApplication.java:311)
at org.mt4j.MTApplication.initialize(MTApplication.java:263)
at org.mt4j.MTApplication.initialize(MTApplication.java:254)
at main.Main$.main(Main.scala:26)
at main.Main.main(Main.scala)
這是我很難也解釋了,因爲我不完全明白是怎麼回事。但是任何擁有這些庫的人都可以在幾分鐘內重現這種情況,試圖啓動主要課程。
抽象startUp()
方法應得到執行,啓動應用程序,讓一切看起來更加難過。它初始化對象,但庫試圖處理的是伴隨類的一個實例,它沒有被初始化,因爲在Scala中該方法屬於該對象。
我的代碼:
object Main extends MTApplication {
def main(args: Array[String]) {
MTApplication.initialize()
new Main().startUp()
}
//this method is abstarct so it MUST be implemented,
override def startUp(){
}
}
class Main extends MTApplication {
override def startUp(){
//startup here
}
}
我很抱歉,如果我的解釋是模糊的,我只是不明白這一切完全。大概瞭解它更容易重複使用MT4j庫與處理源代碼的實驗,而不是在那裏預先鏈接的'core.jar',看看裏面發生了什麼。任何人都有關於任何解決方法的想法嗎?
我很感興趣,請給予解決 – Jus12 2014-10-08 22:32:43
@ Jus12包括一些源,來看看.. – noncom 2014-10-20 11:24:30