[英]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.