JCTree简要分析
文章目录
- JCTree简要分析
-
- JCAnnotatedType
- JCAnnotation
- JCArrayAccess
- JCArrayTypeTree
- JCAssert
- JCAssign
- JCAssignOp
- JCBinary
- JCBlock
- JCBreak
- JCCase
- JCCatch
- JCClassDecl
- JCCompilationUnit
- JCConditional
- JCContinue
- JCDoWhileLoop
- JCEnhancedForLoop
- JCErroneous
- JCExpression
- JCExpressionStatement
- JCFieldAccess
- JCForloop
- JCFunctionalExpression
- JCIdent
- JCIf
- JCImport
- JCinstanceOf
- JCLabeledStatement
- JCLambda
- JCLiteral
- JCMemberReference
- JCMethodDecl
- JCMethodinvocation
- JCModifiers
- JCNewArray
- JCNewClass
- JCParens
- JCPrimitiveTypeTree
- JCReturn
- JCSkip
- JCStatement
- JCSWitch
- JCSynchronized
- JCThrow
- JCTry
- JCTypeApply
- JCTypeCast
- JCTypelntersection
- JCTypeParameter
- JCTypeUnion
- JCUnary
- JCVariableDecl
- JCWhileLoop
- JCWildcard
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;
}