Java用ScriptEngine解析脚本

十二月 24th, 2010 22,077 留下评论 阅读评论

实习第一期的任务基本做完,从python和django的世界又回到了Java,当初来刚来百度的时候怎么也没想到居然还会用上Java。新的任务也很简单,不过正好学习了Java一个新的script包,可以用来解析脚本语法。

javax.script,始于JDK1.6,不过现在只有sun实现的javascript的解析器,难道是因为主要用来解析js语法所以归类到JEE的范畴?不过基本足够了,一般的用途主要是能解析通用的表达式就好,比如X >= 1(X作为参数传入)这样的表达式,也能利用js的函数语法,创造一个就像java的函数一样存在于内存中随时可以被调用的函数,更可以将js中的对象直接转换成java对象。

script包下最主要的是ScriptEngineManager、ScriptEngine、CompiledScript和Bindings 4个类或接口。

ScriptEngineManager是一个工厂的集合,可以通过name或tag的方式获取某个脚本的工厂并生成一个此脚本的ScriptEngine,目前只有javascript的工厂。通过工厂函数得到了ScriptEngine之后,就可以用这个对象来解析脚本字符串了,直接调用Object obj = ScriptEngine.eval(String script)即可,返回的obj为表达式的值,比如true、false或int值。

CompiledScript可以将ScriptEngine解析一段脚本的结果存起来,方便多次调用。只要将ScriptEngine用Compilable接口强制转换后,调用compile(String script)就返回了一个CompiledScript对象,要用的时候每次调用一下CompiledScript.eval()即可,一般适合用于js函数的使用。

Bindings的概念算稍微复杂点,我的理解Bindings是用来存放数据的容器。它有3个层级,为Global级、Engine级和Local级,前2者通过ScriptEngine.getBindings()获得,是唯一的对象,而Local Binding由ScriptEngine.createBindings()获得,很好理解,每次都产生一个新的。Global对应到工厂,Engine对应到ScriptEngine,向这2者里面加入任何数据或者编译后的脚本执行对象,在每一份新生成的Local Binding里面都会存在。

给个代码的例子,其中的functionScript可以从标准输入stdin或者配置文件等地方获得,这样就可以动态的控制Java代码的运行结果

1
2
3
4
5
6
7
8
9
10
11
try {
	ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
	Compilable compilable = (Compilable) engine;
	Bindings bindings = engine.createBindings(); //Local级别的Binding
	String script = "function add(op1,op2){return op1+op2} add(a, b)"; //定义函数并调用
	CompiledScript JSFunction = compilable.compile(script); //解析编译脚本函数
	bindings.put("a", 1);bindings.put("b", 2); //通过Bindings加入参数
	Object result = JSFunction.eval(bindings);
	System.out.println(result); //调用缓存着的脚本函数对象,Bindings作为参数容器传入
}
catch (ScriptException e) {}

另外还有一个ScriptContext的概念,这个可能很少用到吧,它是用来连接ScriptEngine和Bindings的工具。按照JDK的解释:该接口的实现类被用来连接ScriptEngine和宿主应用程序中的对象(如有范围的Bindings)。

Categories: Java, Javascript, 百度 标签:
  1. 四月 20th, 2019 06:17

    Эта предприятие Группа компаний ЗСДКУ Химки выполняет новейшим способом видеодиагностикутехнических систем, сетей хоз. бытовых, сетей хоз. бытовых, водостоков, канализации, водопроводов и т. д.
    Телеинспекция разного варианта труб выполняется специальной камерой, которая проходит по трубам и показывает изображение на монитор и в то же время делается видеозапись труб.
    Такая проверка даёт все возможности для того, чтобы определить качество стенок и стыков труб, зоны расположения свищей, трещин и других повреждений, обнаружить засоры и посторонние предметы, незаконные врезки и т.д. Видеоинспекция также имеет возможность быть использована и в случае приёма трубопроводов впоследствии выполнения строительных работ, ремонта.
    Большим преимуществом устройства видеоинспекции считается ее мобильность, легкость подхода к трубам, а также возможность получать видеоизображение внутренней части трубы.

    Наша организация Открытое акционерное общество ЗСДКУ Новотроицк
    действует на объектах как индивидуальных так и правительственных объектах.

    Обслуживание скважин : Бурение скважин на воду

  2. 四月 12th, 2019 06:36

    Здравствуйте! класный у вас сайт!
    Нашел познавательную новость: https://zen.yandex.ru/media/planetnews/top10-samyh-interesnyh-sekretov-bortrovodnikov-5cadd37f73326700b1d7c536

  3. 三月 30th, 2019 05:13

    В Сервисе вы можете купить ЁМКОСТНОЕ И РЕЗЕРВУАРНОЕ ОБОРУДОВАНИЕ, Отстойники для воды, Мешалка на заказ, Сжигание осадков сточных вод, Контрольные колодцы, Коалесцентные модули, Комплексы реагентного хозяйства (КРХ), ОДЪЕМНЫЕ УСТРОЙСТВА И МЕТАЛЛОКОНСТРУКЦИИ Металлоконструкции фермы, ВОДООЧИСТНОЕ ОБОРУДОВАНИЕ Биологическая очистка хоз.бытовых сточных вод, ПОДЪЕМНЫЕ УСТРОЙСТВА И МЕТАЛЛОКОНСТРУКЦИИ Ангары, Павильоны, ОЧИСТКА ЛИВНЕВЫХ СТОЧНЫХ ВОД Сорбционные фильтры, НАСОСНОЕ И КОМПРЕССОРНОЕ ОБОРУДОВАНИЕ (Грунфос, КСБ, Вило, КИТ, Взлёт, ТВП) Станции повышения давление, ВОДОПОДГОТОВКУ Мембраны и реагенты для осмоса, а также все для автомойки Автомойки на базе песчанно-гравийной фильтрации.

    У нас вы найдете Строительство ЛОС, а также блок биологической загрузки ббз 65, мы можем произвести Насосы для скважин. Бурение артезианских скважин, Инженерные изыскания, Водоснабжение частного дома.

    В компании диагностирует скважины, производит Анализ воды из скважины.

    механическое обезвоживание осадка а главное блок биологической загрузки ббз 65 блок биологической загрузки купить

  4. Aly Chiman | #4
    二月 1st, 2019 02:05

    Hello there,

    My name is Aly and I would like to know if you would have any interest to have your website here at 11034.org promoted as a resource on our blog alychidesign.com ?

    We are in the midst of updating our broken link resources to include current and up to date resources for our readers. Our resource links are manually approved allowing us to mark a link as a do-follow link as well
    .
    If you may be interested please in being included as a resource on our blog, please let me know.

    Thanks,
    Aly

  5. 匿名 | #5
    八月 30th, 2017 14:24

    :sad: :mrgreen: :idea: :grin:

  6. 匿名 | #6
    四月 26th, 2017 15:26

    :twisted: :twisted: :smile: :cool: :?:

  7. 四月 1st, 2016 17:41

    :shock: :razz: :grin: :evil: :?: :???: :???: :???: :???: :???: :???: :???: :???: :???: :???: :???: :???:

  8. tjumyk | #8
    七月 1st, 2013 08:37
  9. 一月 23rd, 2013 15:44

    var arrclass = new Array();
    var arrjob = new Array();

    arrclass.push(new Class(20000,”计算机-软件开发”));
    arrclass.push(new Class(30000,”计算机-网络/通讯”));
    arrclass.push(new Class(10000,”计算机-硬件开发”));
    arrclass.push(new Class(40000,”计算机-管理”));
    arrclass.push(new Class(50000,”计算机-品质管理/技术支持”));
    arrclass.push(new Class(320000,”电子/电器/半导体/仪器仪表”))

    JS中是这些数据,如何解析呢?

    • 呃…这么复杂涉及到OOP了恐怕没法解析吧…没尝试过诶…

icon_wink.gif icon_neutral.gif icon_mad.gif icon_twisted.gif icon_smile.gif icon_eek.gif icon_sad.gif icon_rolleyes.gif icon_razz.gif icon_redface.gif icon_surprised.gif icon_mrgreen.gif icon_lol.gif icon_idea.gif icon_biggrin.gif icon_evil.gif icon_cry.gif icon_cool.gif icon_arrow.gif icon_confused.gif icon_question.gif icon_exclaim.gif