2017-02-26 14 views
0

我希望能夠通過put()將對象傳遞到ScriptEngine,並且能夠從腳本引擎內訪問其屬性和方法。如果我將其中一個類的對象綁定到腳本引擎,那麼如何使用腳本引擎作爲該類的對象來訪問它?

e.g

public class MyClass { 
    String getName() { return "abc"; } 
} 

MyClass my = new MyClass(); 
engine.put("abc", my); 

我怎樣才能做到這一點?

+0

首先,我猜你忘了'new' for'new MyClass()'?如果有,可以輕鬆訪問該對象,這取決於您使用的引擎。我在我的問題中有一個例子:http://stackoverflow.com/questions/42338239/access-variable-of-scriptcontext-using-nashorn-javascript-engine-java-8 - 也許這有助於。我使用上下文雖然... – Philipp

+0

@ Philipp抱歉,我一直在Java和Kotlin之間切換(Kotlin沒有'new') – ycomp

+0

@Philipp訪問不是問題,但我無法弄清楚如何投。我正在使用groovy和JavaScript。 – ycomp

回答

1

這裏是一個完整的工作示例JavaScript。正如我在評論中提到的,你必須確保你的方法是public

import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 
import javax.script.ScriptException; 

public class JavaScriptEngineSample { 

    public static class MyClass { 
     private String name; 

     public String getName() { return name; } 
     public void setName(final String name) { this.name = name; } 
    } 

    public static void main(final String[] args) throws ScriptException { 
     final MyClass my = new MyClass(); 
     my.setName("Input"); 

     final ScriptEngineManager factory = new ScriptEngineManager(); 

     // you could also use 'javascript' here, I'm using 'nashorn' to visualize that I'm using the new Java 8 Engine 
     final ScriptEngine engine = factory.getEngineByName("nashorn"); 

     engine.put("my", my); 

     String script = "java.lang.System.out.println(my.getName());"; 
     script += "my.setName('Output');"; 

     engine.eval(script); 

     System.out.println(my.getName()); 
    } 
} 
+0

謝謝,它的工作原理..然後,我刪除靜態和移動MyClass到另一個包在同一個項目。我得到一個ClassNotFoundException ...我想知道什麼我需要這樣做,以便ScriptEngine知道在哪裏找到類 - 我認爲這可能是我的真實項目中的問題的根源,即使異常或錯誤消息不是'ClassNotFoundException'那裏 – ycomp

+0

這是正常的不是問題,只要班級是公開的,並且可以在班級路線上找到爲了簡單起見,將它保存在一個文件中。你能發表一個沒有運行的例子嗎? – Philipp

+0

這裏是該項目的屏幕截圖..忽略其他背景選項卡..https://ibb.co/fPaNbF – ycomp