2.0以後好像新增長了不少API,有所區別
本文采用Java+Eclipse做爲開發環境
插件支持的語言
文檔:
jeb-1.5/doc/index.html
一.Hello World工程
1. Eclipse插件開發環境配置
新建Java工程->工程目錄下新建lib目錄->右鍵->add to build path
配置JavaDoc 這樣寫代碼的時候 有實時的文檔能夠看
2. 編寫代碼
import jeb.api.IScript;
import jeb.api.JebInstance;
public class Hello implements IScript {
protected JebInstance mJebInstance;
@Override
public void run(JebInstance jebInstance) {
jebInstance.print("Hello World");
}
}
IScript即爲統一接口,
3.JEB中執行代碼
File->Run Script->選擇剛剛的java文件就好
二. 文檔介紹
1.主要的包
2. AST API結構
全部的AST Element實現jeb.api.ast.IElement
要麼繼承於jeb.api.ast.NonStatement,要麼繼承於jeb.api.ast.Statement
IElement定義了getSubElements,但不一樣類型的實現和返回結果也不一樣,
例如:
1. 對Method進行getSubElements返回
函數的參數定義語句
函數體block
2. IfStmt會返回
判斷使用的Predicate
每個if/else/ifelse語句塊
3. Assignment語句返回
左右IExpression操做數
Operator操做符
具體編寫腳本中咱們一般並不使用這個函數,而根據具體類型定義的更細緻的函數,例如Assignment提供的getLeft和getRight.
NonStatement與Expression的區別在於,NonStatement包含了一些高階結構,例如jeb.api.ast.Class, jeb.api.ast.Method這些並不會出如今語句中的AST結構體,他們分別表明一個Class結構和Method結構,注意不要與反射語句中使用的Class和Method混淆
Statement顧名思義就表明了一個語句,但值得注意的是這裏的語句並不表明單個語句,
繼承於Compound的Statement中也可能包含其餘的Statement
非Compound的Statement是最基本的語句結構,它的子節點只會由Expression構成而不會包含block. 例如Assignment,能夠經過getLeft和getRight調用得到左右兩邊的操做對象,分別爲ILeftExpression和IExpression.ILeftExpression表明能夠作左值的Expression,例如變量.而常量顯然不實現ILeftExpression接口
Compound表明多個語句集合的語法塊集合,每個語法塊以Block(也是Compound的子類)呈現,經過getBlocks調用得到.全部分支語句均繼承Compound
以下例子所示:
繼承於Compound的IfStm,也就是Statement
咱們經過getBranchPredicate(idx)獲取Predict,也就是ztz.isDead()這個Expression,
而這個Expression真正的類型是子類Call.
咱們能夠經過getBranchBody(idx)獲取if和if-else中的Block,經過getDefaultBlock獲取else的Block
IExpression表明了最基本的AST節點,其實現關係以下圖
IExpression接口的實現者Expression類表明了算術和邏輯運算的語句片斷,例如a+b, "162" + ztz.toString(), !ztz, redrain*(ztz-162)等等,同時Predicate類是Expression類的直接子類,譬如在if(ztz162)中,該語句的Predicate左值爲ztz162這個identifier,右值爲null.
以ztz.test(1) + 」height" + 162這個Expression爲例,其結構組成和各節點類型以下:
Expression是從右到左的結構
Call沒有提供獲取caller的API,不過能夠經過getSubElements()獲取,返回順序爲
callee method
calling instance (if instance call)
calling arguments, one by one
參考: