+-

我必须将给定的String作为 JavaScript代码执行,例如eval(‘Foo.setMessage(“Hello!”)’),来自名为Engine的类.这里,setMessage()是Foo类的公共静态方法.因为我想从setMessage()方法中访问Engine对象的某些属性,所以如何获取对Engine对象的引用?
我知道如何使用Reflection或CurrentThreadStack或Throwable获取调用者类名(请参阅下面的代码),但这些不返回调用者对象引用.
// ———————————————— —————-
@John:我已按照你的四个步骤制作了以下代码.但是,在Foo类中,我无法获得正在调用setMessage()方法的正确Engine对象.谢谢.
import javax.script.*;
public class Engine {
public static ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("ECMAScript");
public String engineName;
public String message;
public Engine(String name) {
this.engineName = name;
}
public void eval(String script) {
try {
Engine.scriptEngine.eval(script);
//to do something more
} catch (ScriptException e) {
System.out.println(e.toString());
}
}
public static void main(String[] args) {
Engine firstEngine = new Engine("First engine");
Engine.scriptEngine.put("firstEngine", firstEngine);
firstEngine.eval("Packages.Foo.setMessage('Hello!');");
Engine secondEngine = new Engine("Second engine");
Engine.scriptEngine.put("secondEngine", secondEngine);
secondEngine.eval("Packages.Foo.setMessage('Hello!');");
}
}
public class Foo {
public static void setMessage(String msg){
Engine myEngine = (Engine)Engine.scriptEngine.get("What engine to get: first engine or second engine???");
myEngine.message = msg;
System.out.println(myEngine.engineName);
}
}
请帮忙,谢谢,
约翰
最佳答案
步骤1:将当前脚本引擎公开为全局变量.
第2步:将引擎对象保存在脚本引擎中.
第3步:将引擎对象作为参数从javascript传递.
第4步:从Foo.setMessage(SctriptEngine,String)方法获取引擎实例.
步骤1:
第2步:将引擎对象保存在脚本引擎中.
第3步:将引擎对象作为参数从javascript传递.
第4步:从Foo.setMessage(SctriptEngine,String)方法获取引擎实例.
步骤1:
// expose the current script engine as a global variable
scriptEngine.put("scriptEngine", scriptEngine);
第2步:
//save your engine object
scriptEngine.put("myEngine", /*YourEngine instance*/);
第3步:
var imps = JavaImporter(java.io,java.util,/*imports*/);
with(imps){
Foo.setMessage(scriptEngine,"message");
}
第4步:
public class Foo {
// save ScriptEngine instance if you don't want to pass it as parameter
public static void setMessage(ScriptEngine engine,String msg) {
YourEngine myEngine = (YourEngine)engine.get("myEngine");
// use myEngine...
// or
// ScriptContext sc = engine.getContext();
// YourEngine myEngine = (YourEngine)sc.getAttribute("myEngine");
}
}
更新:为所有Engine对象保留相同的密钥名称(例如myEngine).只要结果密钥名称在线程中是唯一的,最好使用当前线程名称或id为密钥名称添加前缀.
String keyName = Thread.currentThread().getName() + "myEngine";
要么
String keyName = Thread.currentThread().getId() + "myEngine";//preferred
点击查看更多相关文章
转载注明原文:如何从被调用的方法中获取调用者对象引用? - 乐贴网