2016-10-08 14 views
2

Javaアプリケーションのレコードを処理するための任意のフィルタ関数をユーザが提供できるようにするインタフェースを作りたいと思います。私はこれにJava Scriptingユーティリティ、特にnashornとJavaScriptを使用することに決めました。nashornからJavaオブジェクト関数にアクセスする方法

それが判明したJavaScriptファイル

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

を得ることを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); 
    } 
} 

を作るためのオブジェクトファクトリ定義でありますナショーンはで定義されている関数にアクセスできませんこの例では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にフィールドを公開することのラッパークラスを書いてしまいました

関連する問題