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 인터페이스에 따라 기본값과 관련이 있음).
무엇이 잘못 되었나요?
저는 자이 썬을 사용하지 않았지만'getEngineByName ("jruby")'가 두드러졌습니다. 확실하게 그것은 "자이 썬"일 필요가 있습니까? –
고마워서 고마워. 코드는 기본적으로 동일하므로 이전 질문에서 복사했습니다. 죄송합니다. – Guss
왜'engine'과'm_engine'이 있습니까? – jfs