+-
如何从被调用的方法中获取调用者对象引用?
我必须将给定的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:

    // 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
点击查看更多相关文章

转载注明原文:如何从被调用的方法中获取调用者对象引用? - 乐贴网