2012-03-13 58 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