2012-03-13 90 views
0

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',看看裏面發生了什麼。任何人都有關於任何解決方法的想法嗎?

回答

-1

問題已解決。這裏是解決方案:

object Main { 

    var current: MainC = _ 

    def main(args: Array[String]) { 
     MTApplication.initialize("org.mttablescreen.main.MainC") 
    } 

} 

class MainC extends MTApplication { 

    //cons 
    Main.current = this 

    //cons ends 

    override def startUp(){ 
     prepare 
    } 

    def prepare() {...} 
} 
+0

我很感興趣,請給予解決 – Jus12 2014-10-08 22:32:43

+0

@ Jus12包括一些源,來看看.. – noncom 2014-10-20 11:24:30