首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala对象与Java Class.newInstance()搏斗

Scala对象与Java Class.newInstance()搏斗
EN

Stack Overflow用户
提问于 2012-03-13 08:15:55
回答 1查看 568关注 0票数 0

更新:

我已经解决了这个问题。如果有人在相同的问题中运行,下面是最简单的解决方案:查看MTApplcation源代码,我发现可以重载initialize()方法,使用一个字符串参数来实例化类名。因此,如果我创建一个单独的类来扩展MTApplication并将它的名称传递到那里,那么一切都会正常工作。

更新的

在使用java库(基于处理的MT4j)时,我遇到了Scala的问题。库希望实例化应用程序的主类(调用者类):

代码语言:javascript
复制
  Class<?> c = Thread.currentThread().getContextClassLoader().loadClass(name);
  applet = (PApplet) c.newInstance();

以便在以后的作品中引用。

但是,由于主Scala类不是一个类,而是一个对象,并且由于库结构,有必要调用主库类initialize()的静态方法MTApplication,所以它失败了。在Java中,静态字段位于类中,但位于Scala对象中。因此,不可能实例化一个对象,而库就失败了。与MT4j不同,处理本身在启动时不调用静态方法,并且成功地通过了该阶段。

如果我只是创建一个同伴类,那么一切都很好,除了同伴类没有初始化它的字段之外,因为静态initialize()方法是在伴侣对象中调用的,类实例就会死掉,库就变得不可用了。

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

我知道这个错误:

代码语言:javascript
复制
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中,方法属于对象。

我的代码:

代码语言:javascript
复制
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‘来查看里面发生的事情要容易得多。有没有人想办法解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-01 14:31:07

问题解决了。以下是解决办法:

代码语言:javascript
复制
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 () {...}
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9680415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档