文档章节

java操作脚本的包Script简介

跳跃的灵活
 跳跃的灵活
发布于 2016/08/03 10:18
字数 852
阅读 3
收藏 0

java6.0里面加了一个很实用的包:javax.script, 它是Java新增的操作脚本的包,利用它我们可以对脚本语言进行操作,比如修改,或者调用,并且可以和Java语言交互,假如我们利用好的话,我们利用它 来实现一些经常要改的部份,这样我们就可以把一些算法写到js文件里面,然后再在运行的时候读取出来并执行,这样就省去了更改一些东西需要重新编译的过程 了. 

  下面我们就来看一个例子吧,看看如何在Java代码里面操作脚本并调用里面的方法.

/*
* Test.java

* Created on 2007-9-19, 15:28:49

* To change this template, choose Tools Templates
* and open the template in the editor.
*/

package lbf.script;

import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.swing.JFrame;

/**
*
* @author hadeslee
*/
public class Test {

 public static void main(String[] args)throws Exception {
  //根据js的后缀名生成一个解析JS的脚本解析引擎
  ScriptEngine engin=new ScriptEngineManager().getEngineByExtension("js");
  //查询一下这个引擎是否实现了下面很实用的接口
  System.out.PRintln(engin instanceof Invocable);
  //声明两个对象,传入到JS里面去
  JFrame jf=new JFrame("test");
  List<String> list=new ArrayList<String>();
  //得到挷定的键值对象,把当前的两个JAVA对象放进去
  Bindings bind=engin.createBindings();
  bind.put("jf",jf);
  bind.put("list",list);
  //把挷下的键值对象放进去,作用域是当前引擎的范围 
  engin.setBindings(bind, ScriptContext.ENGINE_SCOPE);
  //用引擎执行一段写在JS文件里面的代码
  Object obj=engin.eval(new FileReader("test.js"));
  //这个时候返回值当然 是null了
  System.out.println(obj);
  //把当前的引擎强制转为Invocable,这样就可以调用定义在JS文件里面的一个一个函数了
  Invocable in=(Invocable)engin;
  //得到了从JS里面返回来的对象
  List<String> l=(List<String>)in.invokeFunction("getNames");
  System.out.println(l);
  //调用一下定义在JS里面的另一个函数
  in.invokeFunction("testJS");
  //最后调用一个函数,该函数可以使我们前面定义的窗体显示出来
  in.invokeFunction("doSth");
 }
}


  下面是定义在test.js里面的内容

function doSth(){
 jf.setSize(500,300);
 jf.setVisible(true);
 jf.setDefaultCloSEOperation(jf.EXIT_ON_CLOSE);
}
function getNames(){
 list.add("doSth");
 list.add("getNames");
 return list;
}

function testJS(){
 print('Hello world!');
}


  我们可以看到, 在JAVA运行了以后,窗体会显示出来,并且我们可以接收到从JS解析引擎里面传回的数据,当然我们也可以调用一个很普通的JS函数,想象一下,假如我们 把我们程序运行时的一些对象都设到Bindings里面去,那么我们JS岂不是有很大的自由度了吗?因为JS里面也可以操作我们的Java对象了,并且我 们可以像ava编程一样的对JS编程了,还不用再编译,马上就可以运行.灵活性岂不是变得更高了吗?

  过几天写一个利 用Java解析JS提高编程灵活性的例子,以体现一下这个包的用处,不过,JS的缺点就是执行速度慢,比起Java代码那是慢多了,但是一些初始化的事 情,或者一些设置的事情,我们就不用写死在程序里面了,就可以从我们定义的JS文件里面读取了,究竟那些只执行一次的方法牺牲一点效率换来很高的灵活度是 很值得的。

© 著作权归作者所有

下一篇: Mysql 5.7
跳跃的灵活
粉丝 1
博文 27
码字总数 23584
作品 0
海淀
私信 提问
activiti-ScriptTask(脚本任务)

Activiti脚本任务(ScriptTask) Activiti脚本任务(ScriptTask) 作者:邓家海 你一直问为什么到不了远方,请停下数数你的脚步,是不是还没迈开腿 对于没有接触过groovy脚本语言的人来说,可...

方宏春
2018/04/25
0
0
《Groovy极简教程》第1章 Groovy简介

《Groovy极简教程》第1章 Groovy简介 Groovy: 绝妙的; 流行的; 最佳状态的。 A multi-faceted language for the Java platform. (JVM平台上的多面体语言。) 官网文档:http://www.groovy-lan...

程序员诗人
2017/04/16
0
0
在服务器端运行JavaScript文件(一)

简介: 把JavaScript脚本与服务器上Java代码相结合,从而获得在服务器端和客户端都能够自由使用的JavaScript脚本。另外,经过这一系列的被展现技术,无论是基于Ajax还是非Ajax的客户端,都将...

长平狐
2012/10/16
976
0
Android学习笔记(四四):第三方Java库的使用

Java有很多第三方库。Android的Dalvik虚拟器不完全是Java,也就是Android SDK和传统的SDK不完全一样,如果Java库兼容Android,则可被利用。Java库使用受限于下面因素: 目标平台:Java代码适...

鉴客
2011/12/01
770
0
linux - shell脚本快速安装配置jdk

  前言   在Linux安装jdk是很简单的事情,那就让shell脚本去做吧!      安装   到oracle官网的归档网址下载需要的jdk压缩包,并放到脚本所在的目录,然后cd到脚本目录执行就可以,...

linux运维菜
2018/09/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker中部署的应用,获取含有中文字符的验证码图片时无法正常显示

使用docker过程中遇过的最诡异的问题,服务在本地环境中,通过在IDEA里面运行,或者使用java -jar ***.war运行,获取验证码图片都没有问题,但是运行在docker中,图片正常返回,但是上面的汉...

莫在全
1分钟前
0
0
postgres+socket.io+nodejs实时地图应用实践

nodejs一直以异步io著称,其语言特性尤其擅长于在realtime应用中,如聊天室等。在进行实时应用开发时,必不可少的需要用到 socket.io库,可以说,nodejs+socket.io在实时应用中具有较好的表现...

dragon_tech
7分钟前
0
0
Java开发面试题汇总

目前流行的开发技术、常见的面试问题以及问题的答案都已经写的特别清楚了,今天我在之前的基础上,再基于个人的经验继续精选一些面试题给大家阅读参考。 1,Java的反射 Java 反射机制是在运行...

花漾年华
11分钟前
0
0
聊聊flink jdbc的ParameterValuesProvider

序 本文主要研究一下flink jdbc的ParameterValuesProvider ParameterValuesProvider flink-jdbc_2.11-1.8.0-sources.jar!/org/apache/flink/api/java/io/jdbc/split/ParameterValuesProvide......

go4it
11分钟前
0
0
UserInputControls用户输入控制

enum UserInputControls { kGovernedByOrthoMode = 0x0001,//正交模式管理 kNullResponseAccepted = 0x0002,//允许输入空 kDontEchoCancelForCtrlC = 0x0004,//ctrl C 模式不能重复......

一个小妞
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部