进阶注解处理器 processor (二)

什么是 AST

AST(Abstract Syntax Tree 抽象语法树)是一种用来描述程序代码语法结构的树形表示方式,语法树的每一个节点都代表着程序代码中的一个语法结构,例如包、类型、修饰符、运算符、接口、返回值,甚至代码注释等都可以是一个语法结构。

什么是 JCTree

JCTree是语法树元素的基类,它包含两个属性:
type:表示语法结构的类型。
pos:用于指明当前语法树节点(JCTree)在语法树中的位置,因此不能直接用new关键字来创建语法树节点,即使创建了也没有意义,而要用TreeMaker来进行操作。

public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
    public int pos;
    public Type type;
    ...
}

JCTree 有很多子类,eg:
JCStatement、JCClassDecl、JCMethodDecl、JCVariableDecl、JCModifiers、JCExpression …
在后续多少都会用到。

什么是 TreeMaker

TreeMaker创建语法树节点的所有方法,创建时会为创建出来的JCTree设置pos字段,所以必须用上下文相关的TreeMaker对象来创建语法树节点,而不能直接new语法树节点。

Context context = ((JavacProcessingEnvironment) processingEnv).getContext();
TreeMaker treeMaker = TreeMaker.instance(context);
// ...

怎么使用 TreeMaker

部分方法示例:
TreeMaker.MethodDef
用于创建方法定义语法树节点(JCMethodDecl)

public JCMethodDecl MethodDef(JCModifiers mods, Name name,
       JCExpression returntype, List<JCTypeParameter> typarams,
       List<JCVariableDecl> params, List<JCExpression> thrown,
       JCBlock body, JCExpression defaultValue){
    JCMethodDecl tree = new JCMethodDecl(mods, name,
       returntype, typarams, params, thrown, body, 
       defaultValue, null);
    tree.pos = pos;
    return tree;
}

TreeMaker.VarDef
用于创建字段/变量定义语法树节点(JCVariableDecl)

public JCVariableDecl VarDef(JCModifiers mods, Name name, JCExpression vartype, 
        JCExpression init) {
    JCVariableDecl tree = new JCVariableDecl(mods, name, vartype, init, null);
    tree.pos = pos;
    return tree;
}

TreeMaker.Return
用于创建return语句语法树节点(JCReturn)

public JCReturn Return(JCExpression expression) {
    JCReturn jcReturn= new JCReturn(expression);
    jcReturn.pos = this.pos;
    return jcReturn;
}

结语

以上是与JCTree的初次会面,后续逐步进阶~

如果您看到了这里,欢迎和我沟通交流!
             一个95后码农

个人博客:fy-blog

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值