2012-03-13 5 views
0

업데이트 : 다소 문제를 해결 한스칼라 객체가 자바에 Class.newInstance 고투()

. MTApplcation 소스 코드를 살펴보면, initialize() 메소드가 인스턴스화 할 클래스 이름에 대한 String 매개 변수를 사용하여 오버로드 될 수 있음을 발견했습니다. 따라서 MTApplication을 확장하고 이름을 전달하는 별도의 클래스를 만들면 모든 것이 올바르게 작동합니다. 자바 라이브러리 (처리를 기반으로 MT4j을)를 사용하는 동안 UPDATE

END 나는 스칼라 상황이있다.

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

그래서으로이 작품에서 나중에 참조 할 수 : 라이브러리는 응용 프로그램 (발신자 급)의 메인 클래스의 인스턴스를 원한다.

그러나 스칼라 스칼라 클래스는 클래스가 아니라 객체이고 라이브러리 구조로 인해 기본 라이브러리 클래스 MTApplication의 정적 메서드 initialize()을 호출해야하기 때문에 실패합니다. Java에서 정적 필드는 클래스에 있지만 Scala - in 객체에 있습니다. 따라서 객체를 인스턴스화하는 것은 불가능하며 라이브러리는 실패합니다. MT4j와 달리, Processing 자체는 시작할 때 정적 메소드를 호출하지 않고 성공적으로 해당 단계를 통과합니다.

방금 ​​동반자 클래스를 만들면 동반자 클래스에서 static 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() 메서드는 모든 것을 더 슬퍼 보입니다. 객체를 초기화하지만 라이브러리가 작업하려고하는 것은 스칼라에서 메소드가 객체에 속하기 때문에 초기화되지 않는 컴패니언 클래스의 인스턴스입니다.

내 코드 :

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 
    } 
} 

내 설명이 모호한 경우 미안 해요, 난 그냥 완전히 모든 것을하지 않습니다. 아마도 내부에서 무슨 일이 일어나고 있는지 미리 링크 된 'core.jar'대신 처리 소스 코드로 MT4j 라이브러리로 실험을 반복하는 것이 더 쉽다는 것을 이해했을 것입니다. Doeas 사람은 여기에 어떤 해결 방법에 대한 아이디어가 있습니까?

답변

-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() {...} 
} 
+0

저는 흥미가 있습니다. 해결책을 알려주세요. – Jus12

+0

@ Jus12에 소스가 포함되어 있습니다. – noncom