當前位置:首頁 » 編程軟體 » 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的功能,但是用起來不是很方便

熱點內容
華為平板怎麼儲存伺服器文件 發布:2025-02-06 12:49:21 瀏覽:479
php查詢結果數組 發布:2025-02-06 12:31:05 瀏覽:714
怎樣把照片壓縮打包 發布:2025-02-06 12:15:19 瀏覽:496
如何編譯java文件 發布:2025-02-06 12:05:58 瀏覽:237
九九乘法編程 發布:2025-02-06 12:05:05 瀏覽:519
台式機忘記開機密碼怎麼辦 發布:2025-02-06 11:58:01 瀏覽:871
android刷新按鈕 發布:2025-02-06 11:57:17 瀏覽:586
存儲過程有輸入參數和輸出參數 發布:2025-02-06 11:55:32 瀏覽:99
成績評選演算法 發布:2025-02-06 11:42:51 瀏覽:997
資料庫測試數據 發布:2025-02-06 11:31:05 瀏覽:824