更新:
我已经解决了这个问题。如果有人在相同的问题中运行,下面是最简单的解决方案:查看MTApplcation源代码,我发现可以重载initialize()方法,使用一个字符串参数来实例化类名。因此,如果我创建一个单独的类来扩展MTApplication并将它的名称传递到那里,那么一切都会正常工作。
更新的端
在使用java库(基于处理的MT4j)时,我遇到了Scala的问题。库希望实例化应用程序的主类(调用者类):
Class<?> c = Thread.currentThread().getContextClassLoader().loadClass(name);
applet = (PApplet) c.newInstance();以便在以后的作品中引用。
但是,由于主Scala类不是一个类,而是一个对象,并且由于库结构,有必要调用主库类initialize()的静态方法MTApplication,所以它失败了。在Java中,静态字段位于类中,但位于Scala对象中。因此,不可能实例化一个对象,而库就失败了。与MT4j不同,处理本身在启动时不调用静态方法,并且成功地通过了该阶段。
如果我只是创建一个同伴类,那么一切都很好,除了同伴类没有初始化它的字段之外,因为静态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‘来查看里面发生的事情要容易得多。有没有人想办法解决这个问题?
发布于 2012-04-01 14:31:07
问题解决了。以下是解决办法:
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 () {...}
}https://stackoverflow.com/questions/9680415
复制相似问题