更新
我有点解决了这个问题。如果有人遇到同样的问题,这是最简单的解决方案:看看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有没有关于任何解决方法的想法?
答案 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 () {...}
}