当前位置:首页 » 编程软件 » java解析脚本

java解析脚本

发布时间: 2022-08-24 18:39:33

Ⅰ 高分求助:java自定义脚本语言解释器的设计实现思路

这个你有编译原理基础的话,就在找本编译原理的书看,会想起来怎么做的。这个解析过程并不太难。

如果你没学过编译原理,那就别看了,短时间内掌握不了的。可以参考这个思路:
建立一个替换表:
{”如果“ : "if", "并且" : "&&", "则" : "{", "如果结束" : "}"},可能还有很多别的什么的吧
然后对程序进行替换
替换后为:
C = A + B
if(C > 0 && A > 5){
D=100
if(C > 5 && B > 10){
D=200
}
}
然后进行一些语法补全的操作什么的,争取转换为javascript之类的脚本语言。这样就能执行了

对于变量那个判断,可以对于变量进行遍历,查找全部赋值操作左边的变量,就是被赋值变量了,其他的就是可变的

Ⅱ java脚本

JavaScript,是一种基于对象的脚本语言。网景通讯公司最初在它的Navigator 2.0产品上设计并实现的,原名LiveScript。目前已经在WWW上广泛用于动态Web页面的编程语言。

JavaScript已经被Netscape公司提交给ECMA制定为标准,称之为ECMAScript,标准编号ECMA-262。目前最新版为ECMA-262 4th Edition。符合该标准的实现有:
Microsoft公司的JScript.
Mozilla的Javascript-C(C语言实现),现名Spidermonkey
Mozilla的Rhino(Java实现)
Digital Mars公司的DMDScript。

据测试,Spidermonkey的性能最好。

不同于服务器端脚本语言,例如ASP,JavaScript是客户端脚本语言,也就是说JavaScript是在用户的浏览器上运行,不需要服务器的支持而可以独立运行。所以在早期程序员比较青睐于JavaScript以减少对服务器的负担,而与此同时也带来另一个问题:安全性。而随着服务器的强壮,虽然现在的程序员更喜欢运行于服务端的脚本以保证安全,但JavaScript仍然以其跨平台、容易上手等优势大行其道。

JavaScript是一种解释语言,其源代码在发往客户端执行之前不需经过编译,而是将文本格式的字符代码发送给客户编由浏览器解释执行。但这种语言的弱点是容错性较差,如果一条执行不了,那么下面的语言也无法执行,而且由于一条一条的解释,速度较慢。

与其相对应的是编译语言。例如Java。Java的源代码在传递到客户端执行之前,必须经过编译,因而客户端上必须具有相应平台上的仿真器或解释器,它可以通过编译器或解释器实现独立于某个特定的平台编译代码的束缚。但是它必须在服务器端进行编译,这样就拖延了时间。但因为已经封装,所以能保证安全性。

这是以前找到的,说得不错,说出了JavaScript的所有特点,我自己概括也概括不好。Javascript的特点就是:解释执行、不编译、客户端执行。
所以Javascript的作用除了能够做出许多小国外,还能够降低服务器负担(http://www.btchina.net,搜索结果的页面真是绝了,把Javascript降低服务器负担的特点发挥到极致),但由于是解释执行,源代码安全性低。

Ⅲ java编程开发语言编辑脚本应该怎么做

脚本对于大多数程序员来说应该不陌生了吧。今天我们就一起来了解一下,在使用java编程开发语言编写API脚本的时候都需要注意哪些问题。



Java脚本化API为谁准备?


脚本语言的一些有用的特性是:


方便:大多数脚本语言都是动态类型的。您通常可以创建新的变量,而不声明变量类型,并且您可以重用变量来存储不同类型的对象。此外,脚本语言往往会自动执行许多类型的转换,例如, 必要时 将数字10转换为“10”。


开发快速原型:您可以避免编辑编译运行周期,只使用“编辑运行”!


应用扩展/定制:你可以“具体化”的部分应用程序,例如一些配置脚本,业务逻辑/规则和财务应用中的数学表达式 。


为应用添加命令行模式,用于调试、运行时配置/部署时间。现在大多数应用程序都有一个基于Web的GUI配置工具。但是系统管理员/部署人员常常喜欢命令行工具。一个“标准”的脚本语言可以用来实现这个目的,而不是发明特设的脚本语言。


Java 脚本 API 是一种独立于框架的脚本语言,使用来自于Java代码的脚本引擎 。通过java脚本API,可以使用Java语言编写定制/可扩展的应用程序并将自定义脚本语言选择留给终用户 。Java 应用程序开发者不需要在开发过程中选择扩展语言。如果你使用JSR-223 API来编写应用,那么你的用户可以使用任何JSR-223兼容的脚本语言。


脚本包


Java 脚本功能是在 javax.script 包中。这是一个比较小的,简单的API。脚本的出发点是 ScriptEngineManager 类。一个 ScriptEngineManager 对象可以通过jar文件的服务发现机制发现脚本引擎。它也可以实例化脚本引擎来解释使用特定的脚本语言编写的脚本。


脚本变量


当你的java应用程序嵌入脚本引擎和脚本,你可能希望将您的应用程序对象为全局变量暴露于脚本中。这个例子演示了如何将您的应用程序对象作为全局变量暴露于脚本中。我们在应用程序中创建一个 java.io.File对象作为全局变量,名称是file。昆明电脑培训http://www.kmbdqn.com/发现该脚本可以访问变量,例如,它可以调用它的公共方法。注意访问java对象、领域和方法的语法依赖于脚本语言。JavaScript支持“自然”的类似java的语法。


Ⅳ shell脚本调用java返回的字符串含有shell变量如何解析

先运行java程序,然后用echo $?获取程序的运行结果,如果是字符串,可以使用
result=$(java -jar xxx.jar)来获取,当然这只是示例,$()中的命令使可以随便修改的

Ⅳ 如何用java代码实现一个类似,jmeter的beanshell脚本/postman运行脚本的功能(解析字符串运行代码)

beanshell是可以自由适用的脚本语言啊,你可以在你的项目中引入,具体方式请阅读
beanshell官方文档

Ⅵ 怎么通过java去调用并执行shell脚本以及问题总结

对于第一个问题:java抓取,并且把结果打包。那么比较直接的做法就是,java接收各种消息(db,metaq等等),然后借助于jstorm集群进行调度和抓取。
最后把抓取的结果保存到一个文件中,并且通过调用shell打包, 回传。 也许有同学会问,
为什么不直接把java调用odps直接保存文件,答案是,我们的集群不是hz集群,直接上传odps速度很有问题,因此先打包比较合适。(这里不纠结设计了,我们回到正题)

java调用shell的方法

通过ProcessBuilder进行调度

这种方法比较直观,而且参数的设置也比较方便, 比如我在实践中的代码(我隐藏了部分业务代码):

ProcessBuilderpb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, param1,
param2, param3);
pb.directory(new File(SHELL_FILE_DIR));
int runningStatus = 0;
String s = null;
try {
Process p = pb.start();
try {
runningStatus = p.waitFor();
} catch (InterruptedException e) {
}

} catch (IOException e) {
}
if (runningStatus != 0) {
}
return;

这里有必要解释一下几个参数:

RUNNING_SHELL_FILE:要运行的脚本

SHELL_FILE_DIR:要运行的脚本所在的目录; 当然你也可以把要运行的脚本写成全路径。

runningStatus:运行状态,0标识正常。 详细可以看java文档。

param1, param2, param3:可以在RUNNING_SHELL_FILE脚本中直接通过1,2,$3分别拿到的参数。

直接通过系统Runtime执行shell

这个方法比较暴力,也比较常用, 代码如下:

p = Runtime.getRuntime().exec(SHELL_FILE_DIR + RUNNING_SHELL_FILE + " "+param1+" "+param2+" "+param3);
p.waitFor();

我们发现,通过Runtime的方式并没有builder那么方便,特别是参数方面,必须自己加空格分开,因为exec会把整个字符串作为shell运行。

可能存在的问题以及解决方法

如果你觉得通过上面就能满足你的需求,那么可能是要碰壁了。你会遇到以下情况。

没权限运行

这个情况我们团队的朱东方就遇到了, 在做DTS迁移的过程中,要执行包里面的shell脚本, 解压出来了之后,发现执行不了。 那么就按照上面的方法授权吧

java进行一直等待shell返回

这个问题估计更加经常遇到。 原因是, shell脚本中有echo或者print输出, 导致缓冲区被用完了! 为了避免这种情况, 一定要把缓冲区读一下, 好处就是,可以对shell的具体运行状态进行log出来。 比如上面我的例子中我会变成:

ProcessBuilderpb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, keyword.trim(),
taskId.toString(), fileName);
pb.directory(new File(CASPERJS_FILE_DIR));
int runningStatus = 0;
String s = null;
try {
Process p = pb.start();
BufferedReaderstdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReaderstdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((s = stdInput.readLine()) != null) {
LOG.error(s);
}
while ((s = stdError.readLine()) != null) {
LOG.error(s);
}
try {
runningStatus = p.waitFor();
} catch (InterruptedException e) {
}

记得在start()之后, waitFor()之前把缓冲区读出来打log, 就可以看到你的shell为什么会没有按照预期运行。 这个还有一个好处是,可以读shell里面输出的结果, 方便java代码进一步操作。

也许你还会遇到这个问题,明明手工可以运行的命令,java调用的shell中某一些命令居然不能执行,报错:命令不存在!

比如我在使用casperjs的时候,手工去执行shell明明是可以执行的,但是java调用的时候,发现总是出错。
通过读取缓冲区就能发现错误日志了。 我发现即便自己把安装的casperjs的bin已经加入了path中(/etc/profile,
各种bashrc中)还不够。 比如:

exportNODE_HOME="/home/admin/node"
exportCASPERJS_HOME="/home/admin/casperjs"
exportPHANTOMJS_HOME="/home/admin/phantomjs"
exportPATH=$PATH:$JAVA_HOME/bin:/root/bin:$NODE_HOME/bin:$CASPERJS_HOME/bin:$PHANTOMJS_HOME/bin

原来是因为java在调用shell的时候,默认用的是系统的/bin/下的指令。特别是你用root权限运行的时候。 这时候,你要在/bin下加软链了。针对我上面的例子,就要在/bin下加软链:

ln -s /home/admin/casperjs/bin/casperjscasperjs;
ln -s /home/admin/node/bin/nodenode;
ln -s /home/admin/phantomjs/bin/phantomjsphantomjs;

这样,问题就可以解决了。

如果是通过java调用shell进行打包,那么要注意路径的问题了

因为shell里面tar的压缩和解压可不能直接写:

tar -zcf /home/admin/data/result.tar.gz /home/admin/data/result

直接给你报错,因为tar的压缩源必须到路径下面, 因此可以写成

tar -zcf /home/admin/data/result.tar.gz -C /home/admin/data/ result

如果我的shell是在jar包中怎么办?

答案是:解压出来。再按照上面指示进行操作。(1)找到路径

String jarPath = findClassJarPath(ClassLoaderUtil.class);
JarFiletopLevelJarFile = null;
try {
topLevelJarFile = new JarFile(jarPath);
Enumeration<JarEntry> entries = topLevelJarFile.entries();
while (entries.hasMoreElements()) {
JarEntryentry = entries.nextElement();
if (!entry.isDirectory() && entry.getName().endsWith(".sh")) {
对你的shell文件进行处理
}
}

对文件处理的方法就简单了,直接touch一个临时文件,然后把数据流写入,代码:

FileUtils.touch(tempjline);
tempjline.deleteOnExit();
FileOutputStreamfos = new FileOutputStream(tempjline);
IOUtils.(ClassLoaderUtil.class.getResourceAsStream(r), fos);
fos.close();

Ⅶ java编程开发语言编辑脚本应该怎么做

脚本对于大多数程序员来说应该不陌生了吧。今天我们就一起来了解一下,在使用java编程开发语言编写API脚本的时候都需要注意哪些问题。



Java脚本化API为谁准备?


脚本语言的一些有用的特性是:


方便:大多数脚本语言都是动态类型的。您通常可以创建新的变量,而不声明变量类型,并且您可以重用变量来存储不同类型的对象。此外,脚本语言往往会自动执行许多类型的转换,例如,必要时将数字10转换为“10”。


开发快速原型:您可以避免编辑编译运行周期,只使用“编辑运行”!


应用扩展/定制:你可以“具体化”的部分应用程序,例如一些配置脚本,业务逻辑/规则和财务应用中的数学表达式。


为应用添加命令行模式,用于调试、运行时配置/部署时间。现在大多数应用程序都有一个基于Web的GUI配置工具。但是系统管理员/部署人员常常喜欢命令行工具。一个“标准”的脚本语言可以用来实现这个目的,而不是发明特设的脚本语言。


Java脚本API是一种独立于框架的脚本语言,使用来自于Java代码的脚本引擎。通过java脚本API,可以使用Java语言编写定制/可扩展的应用程序并将自定义脚本语言选择留给终用户。Java应用程序开发者不需要在开发过程中选择扩展语言。如果你使用JSR-223API来编写应用,那么你的用户可以使用任何JSR-223兼容的脚本语言。


脚本包


Java脚本功能是在javax.script包中。这是一个比较小的,简单的API。脚本的出发点是ScriptEngineManager类。一个ScriptEngineManager对象可以通过jar文件的服务发现机制发现脚本引擎。它也可以实例化脚本引擎来解释使用特定的脚本语言编写的脚本。


脚本变量


当你的java应用程序嵌入脚本引擎和脚本,你可能希望将您的应用程序对象为全局变量暴露于脚本中。这个例子演示了如何将您的应用程序对象作为全局变量暴露于脚本中。我们在应用程序中创建一个java.io.File对象作为全局变量,名称是file。昆明电脑培训http://www.kmbdqn.cn/发现该脚本可以访问变量,例如,它可以调用它的公共方法。注意访问java对象、领域和方法的语法依赖于脚本语言。JavaScript支持“自然”的类似java的语法。


Ⅷ 帮我看看这个运行java程序的脚本

/opt/java1.5/bin/java 这个是启动jvm,运行java程序。
-cp .:/opt/java1.5/lib:opt/java1.5/jre/lib:$HOME/abcd/lib/jxl.jar:$HOME/abcd/lib/jfreechart-1.0.5.jar:$HOME/abcd/lib/gnujaxp.jar:$HOME/abcd/lib/jcommon-1.0.9.jar:$BIN/com/abc/createexcel/Act.class:$BIN/com/abc/createexcel/Act_2.class:$BIN/com/abc/createexcel/Detail.class:$BIN/com/abc/createexcel/Failure.class 这个是定义了一些classpath路径。
com.abc.createexcel.CreateExcel 这个是要运行的类。
sDefFoundError: com/abc/createexcel/CreateExcel 这个估计是运行的时候出错了,打出来的吧。

你这个错误嘛:后面几个类直接引入$BIN/com/abc/createexcel/这个路径就可以。
找不到CreateExcel,有很多可能性:你编译要对,执行的路径要对。

Ⅸ 怎么用java解析html页面里的javascript 有一些网页里包含了很多的javascript脚本。

你可以使用谷歌浏览器或者火狐浏览器,使用f12键,打开页面调试功能,它显示的就是经过JavaScript执行后的页面,但是并不是所有的JavaScript执行后的页面,也为某些JavaScript的执行需要鼠标或者其他的事件发生以后才会执行,比如onclick、onmouseover等等,ie也有f12的功能,但是用起来不是很方便

热点内容
自带ftp服务器好用吗 发布:2025-02-06 15:26:11 浏览:109
win7访问xp局域网 发布:2025-02-06 15:17:07 浏览:524
均线差算法 发布:2025-02-06 15:13:22 浏览:459
androidbrowser 发布:2025-02-06 15:09:49 浏览:622
勇敢的心ftp 发布:2025-02-06 15:09:03 浏览:327
php日志分析 发布:2025-02-06 15:08:19 浏览:874
36脚本大厅作者 发布:2025-02-06 14:55:53 浏览:409
买电脑配送服务器吗 发布:2025-02-06 14:54:58 浏览:243
服务器怎么删除资源 发布:2025-02-06 14:36:14 浏览:672
安卓如何设置桌面返回键 发布:2025-02-06 13:58:15 浏览:49