2015-06-19 42 views
1

我正在使用ClearScript.NET將Classes暴露給Javascript。我用這個來暴露類(不是類的實例到JS):engine.AddHostType("Worker", typeof(Worker));所以我可以使用var x = new Worker();javascript;Java Nashorn將java類(不是實例)暴露給javascript

現在在Nashorn與Java這不起作用。我只能這樣暴露類的實例:factory.getBindings().put("Worker", new Worker());

有沒有一種方法可以將類型類型暴露給JavaScript與Nashorn。

謝謝!

回答

3

腳本可以通過完全合格的名稱直接訪問任何Java類如

var Vector = Java.type("java.util.Vector"); 
// or equivalently: 
var Vector = java.util.Vector; 
// Java.type is better as it throws exception if class is not found 

如果您不希望腳本直接引用您的Java類或者你想提供一個不同的名稱,你可以這樣做:

import javax.script.*; 

public class Main { 
    public static void main(String[] args) throws ScriptException { 
     ScriptEngineManager m = new ScriptEngineManager(); 
     ScriptEngine e = m.getEngineByName("nashorn"); 

     // eval "java.util.Vector" to get "type" object and then 
     // assign that to a global variable. 
     e.put("Vec", e.eval("java.util.Vector")); 

     // Script can now use "Vec" as though it is a script constructor 
     System.out.println(e.eval("v = new Vec(); v.add('hello'); v")); 
    } 
} 

希望這會有所幫助!

+0

謝謝! @一個。 Sundararajan – PiDEV

0

如果你已經擁有你希望暴露給腳本類型的java.lang.Class對象,你可以做到以下幾點:

import javax.script.*; 
import java.util.Vector; 

public class Main { 
    public static void main(String[] args) throws ScriptException { 
     ScriptEngineManager m = new ScriptEngineManager(); 
     ScriptEngine e = m.getEngineByName("nashorn"); 

     // expose a java.lang.Class object to script 
     e.put("Vec", Vector.class); 

     // script can use "static" property to get "type" represented 
     // by that Class object. 
     System.out.println(e.eval("v = new Vec.static(); v.add('hello'); v")); 
    } 
}