2011-01-06 5 views
1

Question 4617364과 비슷한 작업을하려고하지만 Python 스크립트 파일에서 클래스를로드하십시오. 여기서 클래스는 Java 인터페이스를 구현하고 일부는이 클래스로 넘깁니다. 그 메소드를 사용할 수있는 자바 코드 -하지만 객체 메소드 호출은 유효하지 않은 값을 반환하고 이니셜 라이저에서 인쇄하는 것은 아무 것도하지 않는 것 같습니다.클래스를 구현하는 Jython 스크립트가 Java에서 올바르게 초기화되지 않았습니다.

내 구현은 다음과 같습니다

인터페이스 :

package some.package; 
import java.util.List; 
public interface ScriptDemoIf { 
    int fibonacci(int d); 
    List<String> filterLength(List<String> source, int maxlen); 
} 

파이썬 구현 :

from some.package import ScriptDemoIf 

class ScriptDemo(ScriptDemoIf): 
    """ Class ScriptDemo implementing ScriptDemoIf """ 

    def __init__(self): 
     print "Script Demo init" 

    def fibonacci(self, d): 
     if d < 2: 
      return d 
     else: 
      return self.fibonacci(d-1) + self.fibonacci(d-2) 

    def filterLength(self, source, maxlen): 
     return [ str for str in source if len(str) <= maxlen ] 

클래스 로더가 :

public ScriptDemoIf load(String filename) throws ScriptException { 
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("jython"); 
    FileReader script = new FileReader(filename); 
    try { 
     engine.eval(new FileReader(script)); 
    } catch (FileNotFoundException e) { 
     throw new ScriptException("Failed to load " + filename); 
    } 
    return (ScriptDemoIf) engine.eval("ScriptDemo()"); 
} 

public void run() { 
    ScriptDemoIf test = load("ScriptDemo.py"); 
    System.out.println(test.fibonacci(30)); 
} 

는 (분명히 로더가 조금입니다 실생활에서보다 일반적인 - 구현 클래스 이름이 "ScriptDemo"라고 가정하지 않습니다. 이는 단순성을위한 것입니다.

코드가 실행 된되는 때, 나는 파이썬의 __init__ (I 스크립트의 본문에 인쇄를 넣어이라면 나는 그것을 볼 수 있습니까하지만)에서 인쇄를 참조하지 않지만 같은 run() 모양의 test 변수 유효한 자이 썬 "프록시 객체"와 캐스팅 오류가 발생하지 않습니다. fibonacci() 메서드를 실행하려고하면 항상 고정 된 숫자를 반환하는 메서드를 변경하더라도 항상 0이되고 filterLength() 메서드는 항상 null을 반환합니다 (Java 인터페이스에 따라 기본값과 관련이 있음).

무엇이 잘못 되었나요?

+0

저는 자이 썬을 사용하지 않았지만'getEngineByName ("jruby")'가 두드러졌습니다. 확실하게 그것은 "자이 썬"일 필요가 있습니까? –

+0

고마워서 고마워. 코드는 기본적으로 동일하므로 이전 질문에서 복사했습니다. 죄송합니다. – Guss

+0

왜'engine'과'm_engine'이 있습니까? – jfs

답변

2

자이 썬의 어떤 버전을 사용하고 있습니까? 버그 설명에서 http://bugs.jython.org/issue1681

: 당신은 JSR223 자이 썬 버그로 실행했을 수도

내장 자이 썬 스크립트에서 메소드를 호출은 아무것도하지 않을 때 JSR223와 자이 썬 2.5.2rc2를 사용하여 , 자이 썬 2.2 동안 .1 잘 작동합니다.

+0

사실 그것은 분명히 문제입니다 - 자이 썬 2.5.2rc2를 사용하고 자이 썬 2.5.2rc3으로 업그레이드하면 문제가 해결되었습니다. 감사! – Guss

관련 문제