用nashorn.eval(文件/字符串)加载的代码的寿命

时间:2015-12-12 12:03:38

标签: java nashorn

请考虑以下事项:

ScriptEngineManager manager = new ScriptEngineManager(null); // Why not passing null results in later "nashorn" return null?
this.engine = manager.getEngineByName("nashorn");

File scriptsDir = IOUtils.getScriptDir(); // some file
File[] scripts = scriptsDir.listFiles(new FilenameFilter()
{
    @Override
    public boolean accept(File dir, String name)
    {
        return name.toLowerCase().endsWith(".js");
    }
});

for (File script : scripts) // Loop all
{
    try
    {
        // basically I want to evaluate all script files and pull "QuestHolder" object from them.
        this.engine.eval(new FileReader(script));

        Object o = this.engine.get("qh"); // get "QuestHolder" object.

        if (o instanceof QuestHolder)
        {
            QuestManager.register((QuestHolder) o);
        }
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
    catch (ScriptException e)
    {
        e.printStackTrace();
    }
}

以下是2个.js示例:

/dir/quest1.js:

var QuestHolder = Java.type('example.quest.QuestHolder');
var qh = new QuestHolder("Save the christmas!");

/dir/quest2.js:

var QuestHolder = Java.type('example.quest.QuestHolder');
var qh = new QuestHolder("Get all the presents!");

我想更多地了解内幕。

  1. 对象(本例中为“qh”)存在多长时间?它与Java的引用(GC)相同吗?

  2. 可以肯定的是,当我评估每个下一个脚本时,前一个文件中的所有内容都是100%“丢失”(对于一个我注意到两个脚本中的“qh”不会像我认为的那样发生冲突会在JS)吗?

  3. 3.1。我拿出的那些物品怎么样(“this.engine.get(”qh“)”)?它们现在只存在于Java App的一面吗?

    3.2。如果我用脚本生成函数或JS类扩展,它是如何工作的? (我指的是在脚本中创建Java类的子类,例如:扩展QuestHolder并覆盖一些方法,然后.get it并在我的QuestManager中注册为自定义类对象。)

    总体而言 - 我想尽可能多地理解内部因素,这样我就不会有任何惊喜。

    1. 如果评估(第2点)下一个脚本意味着先前的评估丢失,是否可以以及如何为所有要使用的脚本创建“共享”评估?我想为所有要使用的任务声明全局Java.type(''),这样就不必输入:

      var QuestHolder = Java.type('example.quest.QuestHolder');

    2. ......还有更多新文件。

      1. 我相信它是可能的(我想我在某处读过)让nashorn只能访问预定义的类型(Java.type(''))。是吗?我想让我的脚本只能访问API内容,而不是游戏内部。
      2. 感谢您提供任何链接和/或解释。

0 个答案:

没有答案