簡體   English   中英

如何從nashorn訪問Java對象函數

[英]How to access Java object functions from nashorn

我想創建一個接口,允許用戶提供任意過濾器函數來處理Java應用程序中的記錄。 我決定使用Java Scripting實用程序,特別是nashorn和JavaScript。

我的問題是當我傳入對象來評估時我得到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);
    }
}

javascript文件

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

事實證明,nashorn無法訪問private類中定義的函數,例如示例中的MyObject類。

不想暴露我的嵌套類,所以我最終圍繞它編寫了一個包裝類來公開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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM