2016-10-08 4 views
2

사용자가 Java 애플리케이션의 레코드를 처리하기 위해 임의의 필터 함수를 제공 할 수있는 인터페이스를 만들고 싶습니다. 필자는이를 위해 Java Scripting 유틸리티, 특히 nashorn과 JavaScript를 사용하기로 결정했습니다.Nashorn에서 Java 객체 함수에 액세스하는 방법

내 문제는 내가 객체를 전달하면 MyObject를

public class MyObjectFactory{ 

    private class MyObject{ 
     private final int myint; 
     public MyObject(int i){ 
      myint = i; 
     } 
     public int getValue(){ 
      return myint; 
     } 
    } 

    public MyObject makeObject(int i){ 
     return new MyObject(i); 
    } 
} 

자바 스크립트 파일

function passes(o){ 
    if(o.getValue() > 10){ 
     return true; 
    } else { 
     return false; 
    } 
} 

답변

2

그것은 밝혀 내가 TypeError: org.XXX.XXX.MyClass has no such function xxx ...

public class FilterClass{ 
    ScriptEngine engine; 
    Invocable inv; 
    public FilterClass(File file){ 
     ScriptEngineManager manager = new ScriptEngineManager(); 
     engine = manager.getEngineByName("JavaScript"); 
     engine.eval(new FileReader(file)); 
     inv = (Invocable) engine; 
    } 
    public boolean passes(MyObject object){ 
     Object result = inv.invokeFunction("passes", object); 
     return (Boolean) result; 
    } 
} 

객체 팩토리 정의 할 수 평가하는 것입니다 nashorn은에 정의 된 함수에 액세스 할 수 없습니다.예제의 MyObject 클래스와 같은 클래스.

public class MyObjectWrapper{ 
    private final MyObject myobject; 
    public MyObjectWrapper(MyObject o){ 
     myobject = o; 
    } 
    public int getValue(){ 
     return myobject.getValue(); 
    } 
} 

가 그럼 난 포장하여 기능에 액세스 할 수 있습니다 :

public boolean passes(MyObject object){ 
     Object result = inv.invokeFunction("passes", new MyObjectWrapper(object)); 
     return (Boolean) result; 
    } 
내 중첩 클래스를 노출하고 싶지 않았다

은 그래서 MyObject를 필드를 노출하는 래퍼 클래스를 작성 결국