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