Java抽象语法树AST,JCTree 分析

JCTree简要分析

JCAnnotatedType

被注解的泛型:(注解的Target为ElementType.TYPE_USE时可注解泛型)

public static class A<T extends @Reality String> {
   
    
}
  • JCAnnotatedType @Reality() String
  • annotations (List<JCTree.JCAnnotation>) [0] = (JCAnnotation) @Reality()
  • underlyingType (JCExpression) = (JCIdent) String
protected JCAnnotatedType(List<JCTree.JCAnnotation> var1, JCTree.JCExpression var2) {
   
    Assert.check(var1 != null && var1.nonEmpty());
    this.annotations = var1;
    this.underlyingType = var2;
}

JCAnnotation

注解:@annotationType(args) 例子:@Reality(callSuper = false)

  • JCAnnotation @Reality(callSuper = false)
  • annotationType (JCTree) = (JCIdent) Reality
  • args (List<JCExpression>) = callSuper = false
  • attribute (Compound) = @com.juno.annotations.Reality(callSuper=false)
protected JCAnnotation(JCTree.Tag var1, JCTree var2, List<JCTree.JCExpression> var3) {
   
    this.tag = var1;
    this.annotationType = var2;
    this.args = var3;
}

JCArrayAccess

数组访问:a[0] = “123”

  • index (JCExpression) = 0 (JCLiteral)
  • indexed (JCExpression) = a (JCIdent)
protected JCArrayAccess(JCTree.JCExpression var1, JCTree.JCExpression var2) {
   
    this.indexed = var1;
    this.index = var2;
}

JCArrayTypeTree

数组类型:String[] a = new String[2] 中表达式的右边:

  • elemtype (JCExpression) = String (JCIdent)

二维数组:String[][] a = new String[1][2]解析为:

  • JCArrayTypeTree String[]
  • JCIdent String
protected JCArrayTypeTree(JCTree.JCExpression var1) {
   
    this.elemtype = var1;
}

JCAssert

assert断言:assert cond : detail

protected JCAssert(JCTree.JCExpression var1, JCTree.JCExpression var2) {
   
    this.cond = var1;
    this.detail = var2;
}

JCAssign

赋值:lhs = rhs 例如 i = 1

protected JCAssign(JCTree.JCExpression var1, JCTree.JCExpression var2) {
   
    this.lhs = var1; //左表达式
    this.rhs = var2; //右表达式
}

JCAssignOp

赋值:lhs opcode rhs 例如 i += 1

protected JCAssignOp(JCTree.Tag var1, JCTree var2, JCTree var3, Symbol var4) {
   
    this.opcode = var1;
    this.lhs = (JCTree.JCExpression)var2;
    this.rhs = (JCTree.JCExpression)var3;
    this.operator = var4;
}

赋值符号opcode的可取值:

/** Assignment operators, of type Assignop.
 */
BITOR_ASG(BITOR),                // |=
BITXOR_ASG(BITXOR),              // ^=
BITAND_ASG(BITAND),              // &=

SL_ASG(SL),                      // <<=
SR_ASG(SR),                      // >>=
USR_ASG(USR),                    // >>>=
PLUS_ASG(PLUS),                  // +=
MINUS_ASG(MINUS),                // -=
MUL_ASG(MUL),                    // *=
DIV_ASG(DIV),                    // /=
MOD_ASG(MOD),                    // %=

JCBinary

将语句分为二叉结构,例如double i = d + i * f 中第一个JCBinary为:

  • lhs = d
  • rhs = i * f
  • operator = null
  • opcode = PLUS

第二个JCBinary为:

  • lhs = i
  • rhs = f
  • operator = null
  • opcode = MUL
protected JCBinary(JCTree.Tag var1, JCTree.JCExpression var2, JCTree.JCExpression var3, Symbol var4) {
   
    this.opcode = var1;
    this.lhs = var2;
    this.rhs = var3;
    this.operator = var4;
}

二元运算符opcode的可取值:

/** Binary operators, of type Binary.
 */
OR,                              // ||
AND,                             // &&
BITOR,                           // |
BITXOR,                          // ^
BITAND,                          // &
EQ,                              // ==
NE,                              // !=
LT,                              // <
GT,                              // >
LE,                              // <=
GE,                              // >=
SL,                              // <<
SR,                              // >>
USR,                             // >>>
PLUS,                            // +
MINUS,                           // -
MUL,                             // *
DIV,                             // /
MOD,                             // %

JCBlock

语句块:{stats} 或 static{stats}(flags = 8L时)

protected JCBlock(long var1, List<JCTree.JCStatement> var3) {
   
    this.stats = var3;
    this.flags = var1;
}

JCBreak

break语句:break:label

  • label 为标签名
  • target 为跳转目标
protected JCBreak(Name var1, JCTree var2) {
   
    this.label = var1;
    this.target = var2;
}

JCCase

case语句:case pat : stats

protected JCCase(JCTree.JCExpression var1, List<JCTree.JCStatement> var2) {
   
    this.pat = var1;
    this.stats = var2;
}

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值