请考虑以下事项:
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 App的一面吗?
3.2。如果我用脚本生成函数或JS类扩展,它是如何工作的? (我指的是在脚本中创建Java类的子类,例如:扩展QuestHolder并覆盖一些方法,然后.get it并在我的QuestManager中注册为自定义类对象。)
总体而言 - 我想尽可能多地理解内部因素,这样我就不会有任何惊喜。
如果评估(第2点)下一个脚本意味着先前的评估丢失,是否可以以及如何为所有要使用的脚本创建“共享”评估?我想为所有要使用的任务声明全局Java.type(''),这样就不必输入:
var QuestHolder = Java.type('example.quest.QuestHolder');
......还有更多新文件。
感谢您提供任何链接和/或解释。