Java 实现Nashorn类滤波器等价

Java 实现Nashorn类滤波器等价,java,java-8,nashorn,Java,Java 8,Nashorn,使用nashorn库jdk.nashorn.api.scripting.可以实现ClassFilter接口来禁用在Java中运行的javascript中实例化任何类: private static class NoJavaFilter implements ClassFilter { @Override public boolean exposeToScripts(String s) { return false; } } 当您这样起动发动机时,此功能

使用nashorn库
jdk.nashorn.api.scripting.
可以实现
ClassFilter
接口来禁用在Java中运行的javascript中实例化任何类:

private static class NoJavaFilter implements ClassFilter {

    @Override
    public boolean exposeToScripts(String s) {
        return false;
    }
}
当您这样起动发动机时,此功能起作用:

NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ScriptEngine nashorn = factory.getScriptEngine(new NoJavaFilter());
但我使用的是内置的Java8
javax.script
library:

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("nashorn");
如果没有
ClassFilter
,您有没有想过如何实现等效的功能

更新

此代码在Wildfly 14 EJB容器中运行。jsutilsbean被注入到调用程序中,调用程序运行
run
方法,将脚本作为参数发送

@Stateless
public class JsUtils {

    public String run(String script) throws ScriptException,
                                            NoSuchMethodException {     

        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("nashorn");                  
        Object result = engine.eval(script);
        return result.toString();
    }
}

使用
jdk.nashorn.api.scripting
库,没有其他方法

在您需要使用引擎时,似乎只有
ScriptEngineManager
接口可用。我想接下来的问题是
ScriptEngineManager
如何在应用程序中初始化?查看javadoc,您似乎可以注册alternative
ScriptEngineFactory
对象。您可以使用“nashorn safe”这样的名称创建自己的
ScriptEngineFactory
。如果
NashornScriptEngineFactory
在初始化时可用,它甚至可以修饰它。
ScriptEngineFactory
创建
ScriptEngine
类,这些类用于运行脚本。相反,我要寻找的是一种创建
ScriptEngineManager
类的方法,告诉它过滤Java类。通过查看javadocs,我无法理解这一点。此外,我找不到使用
ScriptEngineFactory
ScriptEngineManager
ScriptEngineManager
has
registerEngineName()
和相关方法注册自己工厂的任何示例。SEM使用注册工厂构造与名称关联的特定
ScriptEngine
。该注册已经发生在应用程序中的某个地方,可能是隐式的;sem.registerEngineName(“nashorn过滤器”,新的NashornScriptEngineFactory(){ScriptEngine getScriptEngine(){return super.getEngine(NoJavaFilter();}}});但是您可能对
ScriptEngineManager
的创建时间有限制,或者必须在整个应用程序中共享一个;这就是为什么我询问不同的使用地点和时间。