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

Java 加载nashorn.eval(文件/字符串)的代码的寿命,java,nashorn,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[] scri

考虑以下几点:

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!");
我想知道更多关于内部的事情

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

  • 当我评估下一个脚本时,上一个文件中的所有内容都是100%丢失的(我注意到两个脚本中的“qh”并没有像我在JS中所想的那样发生冲突),这是安全的吗

  • 3.1。我拉出的那些对象(“this.engine.get”(“qh”)呢?它们现在是否只存在于Java应用程序端

    3.2。对于我用脚本生成的函数或JS类扩展,它是如何工作的?(我指的是在脚本中创建Java类的子类,例如:扩展QuestHolder并重写某个方法,然后获取它并在QuestManager中注册为自定义类对象)

    总的来说,我希望尽可能多地理解内部结构,这样我就不会有任何惊喜

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

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

  • …当您创建新文件时,还会有更多

  • 我相信有可能(我想我在什么地方读到过)让nashorn只能访问预定义的类型(Java.type(“”))。它是?我想让我的脚本只访问API的东西,而不是游戏的内部

  • 感谢您提供的链接和/或解释。

    脚本引擎缓存已编译的类对象。脚本函数在通常的GC规则下是活动的——只要存在可以从另一个活动对象访问的可传递链接。因此,Java.type是活动的,只要您从使用它的脚本函数调用中引用它

    您可以使用特定于nashorn的API jdk.nashorn.API.scripting.ClassFilter()过滤对Java类型的脚本访问