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
参考: