Scala对象与Java Class.newInstance()斗争

时间:2012-03-13 08:15:55

标签: scala object static-methods

更新

我有点解决了这个问题。如果有人遇到同样的问题,这是最简单的解决方案:看看MTApplcation源代码,我发现可以重载initialize()方法,将类的名称的String参数带到实例。因此,如果我创建一个扩展MTApplication并在其中传递名称的单独类,则一切正常。

END OF UPDATE

我在尝试使用Java库(MT4j,基于Processing)时遇到Scala的情况。该库想要实例化app的主类(调用者类):

  Class<?> c = Thread.currentThread().getContextClassLoader().loadClass(name);
  applet = (PApplet) c.newInstance();

以便稍后参考它的作品。

然而,它失败了,因为我猜,主要的Scala类不是一个类,而是一个对象,并且由于库结构,有必要调用主库类{initialize()的静态方法。 1}}。在Java中,静态字段位于类中,但位于Scala - in对象中。因此无法实例化对象并且库失败。与MT4j相比,Processing本身在启动时不会调用静态方法并成功通过该阶段。

如果我只是创建一个伴侣类,一切正常,除了伴侣类没有初始化它的字段,因为在伴随对象中调用了静态MTApplication方法,类实例只是死了,而且库变得无法使用。

至少我是如何理解这个问题的。

我收到此错误:

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) 方法,使一切看起来更加悲伤。它初始化了对象,但是库试图使用的是伴随类的一个实例,它不会被初始化,因为在Scala中该方法属于该对象。

我的代码:

startUp()

如果我的解释含糊不清,我很抱歉,我只是不完全理解。可能理解用MT4j库重复实验更容易处理源代码而不是预先链接的'core.jar',看看里面发生了什么。 Doeas有没有关于任何解决方法的想法?

1 个答案:

答案 0 :(得分:-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 () {...}
}