zoukankan      html  css  js  c++  java
  • Java抽象语法树AST,JCTree 分析

    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
    unknown
    JCTypeParameter
    JCTypeUnion
    JCUnary
    JCVariableDecl
    JCWhileLoop
    JCWildcard
    JCAnnotatedType
    被注解的泛型:(注解的Target为ElementType.TYPE_USE时可注解泛型)

    public static class A<T extends @Reality String> {

    }
    1
    2
    3
    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;
    }
    1
    2
    3
    4
    5
    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;
    }
    1
    2
    3
    4
    5
    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;
    }
    1
    2
    3
    4
    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;
    }
    1
    2
    3
    JCAssert
    assert断言:assert cond : detail

    protected JCAssert(JCTree.JCExpression var1, JCTree.JCExpression var2) {
    this.cond = var1;
    this.detail = var2;
    }
    1
    2
    3
    4
    JCAssign
    赋值:lhs = rhs 例如 i = 1

    protected JCAssign(JCTree.JCExpression var1, JCTree.JCExpression var2) {
    this.lhs = var1; //左表达式
    this.rhs = var2; //右表达式
    }
    1
    2
    3
    4
    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;
    }
    1
    2
    3
    4
    5
    6
    赋值符号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), // %=
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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;
    }
    1
    2
    3
    4
    5
    6
    二元运算符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, // %
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    JCBlock
    语句块:{stats} 或 static{stats}(flags = 8L时)

    protected JCBlock(long var1, List<JCTree.JCStatement> var3) {
    this.stats = var3;
    this.flags = var1;
    }
    1
    2
    3
    4
    JCBreak
    break语句:break:label

    label 为标签名
    target 为跳转目标
    protected JCBreak(Name var1, JCTree var2) {
    this.label = var1;
    this.target = var2;
    }
    1
    2
    3
    4
    JCCase
    case语句:case pat : stats

    protected JCCase(JCTree.JCExpression var1, List<JCTree.JCStatement> var2) {
    this.pat = var1;
    this.stats = var2;
    }
    1
    2
    3
    4
    JCCatch
    catch捕捉异常:catch(param) body

    param 定义异常变量 Exception e
    body 代码块
    protected JCCatch(JCTree.JCVariableDecl var1, JCTree.JCBlock var2) {
    this.param = var1;
    this.body = var2;
    }
    1
    2
    3
    4
    JCClassDecl
    类的定义:

    例子:

    @Reality
    public class MainActivity extends AppCompatActivity {

    private int kk = 1;

    static {
    kk = 2;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }

    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    mods (JCModifiers) = public
    name (Name) = (NameImpl) MainActivity
    extending (JCExpression) = (JCIdent) AppCompatActivity
    implementing (JCExpression) 实现的接口
    defs (List<JCTree>) :
    defs(1) : JCMethodDecl
    public <init>() {
    super();
    }
    1
    2
    3
    defs(2) : JCBlock
    static {
    kk = 2;
    }
    1
    2
    3
    defs(3) : JCVariableDecl
    private int kk = 1
    1
    defs(4) : JCMethodDecl
    @Override()
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView textView = findViewById(R.id.text);
    Random random = new Random();
    }
    1
    2
    3
    4
    5
    6
    7
    sym (ClassSymbol) = com.juno.utils.MainActivity
    protected JCClassDecl(JCTree.JCModifiers var1, Name var2, List<JCTree.JCTypeParameter> var3, JCTree.JCExpression var4, List<JCTree.JCExpression> var5, List<JCTree> var6, ClassSymbol var7) {
    this.mods = var1;
    this.name = var2;
    this.typarams = var3;
    this.extending = var4;
    this.implementing = var5;
    this.defs = var6;
    this.sym = var7;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    JCCompilationUnit
    /**
    * Everything in one source file is kept in a TopLevel structure.
    * @param pid The tree representing the package clause.
    * @param sourcefile The source file name.
    * @param defs All definitions in this file (ClassDef,Import,and Ski
    * @param packge The package it belongs to.
    * @param namedImportScope A scope for all named imports.
    * @param starImportScope A scope for all import-on-demands.
    * @param linelMap Line starting positions,defined only if option-g is set.
    * @param docComments A hashtable that stores all documentation comments indexed by the tree nodes they refer to.defined only if option-s is set.
    * @param endPositions A hashtable that stores ending positions of source ranges indexed by the tree nodes they belong to. Defined only if option-Xjcov is set.
    */
    public static class JCCompilationUnit extends JCTree implements CompilationUnitTre{
    public List<JCAnnotation>packageAnnotations:
    public JCExpression pid:
    public List<JCTree>defs:
    public JavaFileObject sourcefile:
    public Package Symbol packge:
    public ImportScope namedImportScope:
    public StarImportScope starImportScope:
    public long flags:
    public Position.LinelMap linelMap=null:
    public Map<JCTree,String>docComments=null:
    public Map<JCTree,Integer>endPositions=null:

    protected JCCompilationUnit(List<JCAnnotation>packageAnnotations,
    JCExpression pid,
    List<JCTree>defs,
    JavaFileObject sourcefile,
    Pack ageSymbol packge,
    ImportScope namedImportScope,
    Star ImportScope starImportScope){
    this.packageAnnotations =packageAnnotations:
    this.pid=pid:
    this.defs=defs:
    this.sourcefile=sourcefile:
    this.packge=packge:
    this.namedImportScope=namedImportScope:
    this.starImportScope=starImportScope:
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    JCConditional
    三目运算符:cond ? truepart : falsepart 例如 a ? 1 : 3

    protected JCConditional(JCTree.JCExpression var1, JCTree.JCExpression var2, JCTree.JCExpression var3) {
    this.cond = var1;
    this.truepart = var2;
    this.falsepart = var3;
    }
    1
    2
    3
    4
    5
    JCContinue
    continue跳过一次循环,与break相似:continue label

    protected JCContinue(Name var1, JCTree var2) {
    this.label = var1;
    this.target = var2;
    }
    1
    2
    3
    4
    JCDoWhileLoop
    do-while循环:do{body}while(cond)

    protected JCDoWhileLoop(JCTree.JCStatement var1, JCTree.JCExpression var2) {
    this.body = var1;
    this.cond = var2;
    }
    1
    2
    3
    4
    JCEnhancedForLoop
    增强循环:for(var : expr) body

    例如:

    for (String s : list) {
    print(s);
    }
    1
    2
    3
    JCVariableDecl String s 定义字符串变量s
    JCIdent list 遍历的容器
    JCBlock { print(s); } 遍历块
    protected JCEnhancedForLoop(JCTree.JCVariableDecl var1, JCTree.JCExpression var2, JCTree.JCStatement var3) {
    this.var = var1;
    this.expr = var2;
    this.body = var3;
    }
    1
    2
    3
    4
    5
    JCErroneous
    Error trees

    JCExpression
    表达式,赋值、调用方法等都算一个表达式,凡是继承JCExpression都算一个表达式

    JCExpressionStatement
    内部封装了JCExpression,实际上还是个表达式

    protected JCExpressionStatement(JCTree.JCExpression var1) {
    this.expr = var1;
    }
    1
    2
    3
    JCFieldAccess
    访问父类、其他类的方法、变量时:super.onCreate()

    selected (JCIdent) = super
    name (NameImpl) = onCreate
    protected JCFieldAccess(JCTree.JCExpression var1, Name var2, Symbol var3) {
    this.selected = var1;
    this.name = var2;
    this.sym = var3;
    }
    1
    2
    3
    4
    5
    JCForloop
    for循环:

    for (init; cond; step) {body}(body为JCBlock)
    for (init; cond; step) body(body为JCExpressionStatement)
    protected JCForLoop(List<JCTree.JCStatement> var1, JCTree.JCExpression var2, List<JCTree.JCExpressionStatement> var3, JCTree.JCStatement var4) {
    this.init = var1;
    this.cond = var2;
    this.step = var3;
    this.body = var4;
    }
    1
    2
    3
    4
    5
    6
    JCFunctionalExpression
    函数式表达式:lambda(JCLambda)和method reference(JCMemberReference)继承于JCFunctionalExpression

    JCIdent
    出现在表达式中的变量名、调用的方法名以及类名等,例子如下(按顺序):

    Reality 类(注解)
    AppCompatActivity 类
    String 类
    Override 类
    Bundle 类
    super super和this都是一个JcIdent
    savedInstanceState 调用变量的名字
    setContentView 方法
    R 类
    textView 调用变量的名字
    findViewById 方法
    R类
    @Reality //JCIdent Reality ClassSymbol com.juno.annotations.Reality
    //JCIdent AppCompatActivity ClassSymbol android.support.v7.app.AppCompatActivity
    public class MainActivity extends AppCompatActivity {

    //JCIdent String ClassSymbol java.lang.String
    private static final String TAG = "MainActivity";

    private int kk = 1;

    @Override //JCIdent Override ClassSymbol java.lang.Override
    //JCIdent Bundle ClassSymbol android.os.Bundle
    protected void onCreate(Bundle savedInstanceState) {

    //JCIdent super
    //JCIdent savedInstanceState
    super.onCreate(savedInstanceState);

    //JCIdent setContentView
    //JCIdent R
    setContentView(R.layout.activity_main);

    TextView textView;
    //JCIdent textView
    //JCIdent findViewById
    //JCIdent R
    textView = findViewById(R.id.text);

    int i = 0;
    int j = 1;

    //JCIdent i
    //JCIdent j
    i = j * 3 + 2;

    //JCIdent this
    this.kk = 0;
    }

    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    其中TextView textView;这一句是变量定义语句(JCVariableDecl),该语句的vartype属性实际上也是个JCIdent:

    JCVariableDecl TextView textView
    name (Name) = textView (NameImpl)
    vartype (JCExpression) = TextView (JCIdent)
    JCIf
    if判断语句:if(condition) {thenpart} else {elsepart}

    protected JCIf(JCTree.JCExpression var1, JCTree.JCStatement var2, JCTree.JCStatement var3) {
    this.cond = var1;
    this.thenpart = var2;
    this.elsepart = var3;
    }
    1
    2
    3
    4
    5
    JCImport
    import语句:

    import qulid
    static (if staticImport) import qulid
    protected JCImport(JCTree var1, boolean var2) {
    this.qualid = var1;
    this.staticImport = var2;
    }
    1
    2
    3
    4
    JCinstanceOf
    instanceof语句:expr instanceof clazz,例如textView instanceof View:

    JCInstanceOf textView instanceof View
    clazz (JCTree) = (JCIdent) View
    expr (JCExpression) = (JCIdent) textView
    protected JCInstanceOf(JCTree.JCExpression var1, JCTree var2) {
    this.expr = var1;
    this.clazz = var2;
    }
    1
    2
    3
    4
    JCLabeledStatement
    带有标签的语句:label : body

    protected JCLabeledStatement(Name var1, JCTree.JCStatement var2) {
    this.label = var1;
    this.body = var2;
    }
    1
    2
    3
    4
    JCLambda
    lambda表达式:此处表达式主体只有一句表达式

    textView.setOnClickListener(v -> v.setVisibility(View.INVISIBLE));
    1
    JCLambda (v)->v.setVisibility(View.INVISIBLE) (表达式整体)
    params (List<JCTree.JCVariableDecl>) = (List) /*missing*/ v (参数定义列表)
    body (JCTree) = (JCMethodInvocation) v.setVisibility(View.INVISIBLE) (主体)
    canCompleteNormally (Boolean) = true (未知)
    paramKind (ParameterKind) = IMPLICIT (参数类型隐形/明确)
    getBodyKind() (BodyKind) = EXPRESSION (主体是表达式还是块)
    当主体变为语句块时:

    textView.setOnClickListener(v -> {
    v.setVisibility(View.VISIBLE);
    });
    1
    2
    3
    body (JCTree) = (JCBlock) {v.setVisibility(View.VISIBLE);}
    getBodyKind() (BodyKind) = STATEMENT
    当参数v指明类型为View时:

    textView.setOnClickListener((View v) -> v.setVisibility(View.INVISIBLE));
    1
    paramKind (ParameterKind) = IMPLICIT (参数类型明确)
    JCLiteral
    表示常量:int a = 1

    typetag (TypeTag) = INT
    value (Object) = (Integer) 1
    protected JCLiteral(TypeTag var1, Object var2) {
    this.typetag = var1;
    this.value = var2;
    }
    1
    2
    3
    4
    typetag的可选值有:

    INT : int
    LONG : long
    FLOAT : float
    DOUBLE : double
    CHAR : char
    CLASS : String
    BOT : null
    1
    2
    3
    4
    5
    6
    7
    JCMemberReference
    lambda表达式中的方法引用:expr::name

    例子:new B(“123”).setObjectUtil(ObjectUtil::new);

    JCMemberReference ObjectUtil::new
    mode (ReferenceMode) = NEW
    name (Name) = (NameImpl)
    expr (JCExpression) = (JCIdent) ObjectUtil
    例子:new B(“123”).setObjectUtil(this::util);

    JCMemberReference this::util
    mode (ReferenceMode) = INVOKE
    name (Name) = (NameImpl) util
    expr (JCExpression) = (JCIdent) this
    protected JCMemberReference(ReferenceMode var1, Name var2, JCTree.JCExpression var3, List<JCTree.JCExpression> var4) {
    this.mode = var1;
    this.name = var2;
    this.expr = var3;
    this.typeargs = var4;
    }
    1
    2
    3
    4
    5
    6
    JCMethodDecl
    方法的定义:

    例子:

    @Reality
    private static <T extends String> int print(@NonNull final String s) throws RuntimeException {
    Log.e(TAG, s);
    return 1;
    }
    1
    2
    3
    4
    5
    mods (JCModifiers) = @Reality() private static
    name (Name) = (NameImpl) print
    restype (JCExpression) = (JCPrimitiveTypeTree) int
    typarams (JCTypeParameter) = T extends String
    recvparam = null
    params (List<JCVariableDecl>) [0] = @NonNull() final String s
    thrown (JCExpression) = (JCIdent) RuntimeException
    body (JCBlock) = {
    Log.e(TAG, s);
    return 1;
    }
    defaultVaule (JCExpression) = null
    sym (MethodSymbol) = print(java.lang.String)
    例子:

    @Reality
    @interface B {
    int value() default 1;
    }
    1
    2
    3
    4
    name (Name) = (NameImpl) value
    restype (JCExpression) = (JCPrimitiveTypeTree) int
    typarams (JCTypeParameter) 泛型列表为空
    recvparam = null
    params (List<JCVariableDecl>) 参数定义为空
    thrown (JCExpression) 抛出列表为空
    body (JCBlock) 方法体为空
    defaultVaule (JCExpression) = (JCLiteral) 1
    sym (MethodSymbol) = value()
    protected JCMethodDecl(JCTree.JCModifiers var1, Name var2, JCTree.JCExpression var3, List<JCTree.JCTypeParameter> var4, JCTree.JCVariableDecl var5, List<JCTree.JCVariableDecl> var6, List<JCTree.JCExpression> var7, JCTree.JCBlock var8, JCTree.JCExpression var9, MethodSymbol var10) {
    this.mods = var1;
    this.name = var2;
    this.restype = var3;
    this.typarams = var4;
    this.params = var6;
    this.recvparam = var5;
    this.thrown = var7;
    this.body = var8;
    this.defaultValue = var9;
    this.sym = var10;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    JCMethodinvocation
    方法执行语句: meth(args)

    例子:notNull(before)

    meth (JCExpression) = (JCIdent) notNull
    args (List<JCExpression>) = (JCIdent) before
    例子:proxy.invoke(target, method, args)

    meth (JCExpression) = (JCFieldAccess) proxy.invoke
    args (List<JCExpression>) = (JCIdent) target, method, args
    protected JCMethodInvocation(List<JCTree.JCExpression> var1, JCTree.JCExpression var2, List<JCTree.JCExpression> var3) {
    this.typeargs = var1 == null ? List.nil() : var1;
    this.meth = var2;
    this.args = var3;
    }
    1
    2
    3
    4
    5
    JCModifiers
    类、变量、方法等的修饰符和注解:例如:

    @Reality private static final String TAG = "MainActivity";
    1
    flags (long) = 26L (2L | 8L | 16L)
    annotations (List<JCTree.JCAnnotation>) = @Reality()
    protected JCModifiers(long var1, List<JCTree.JCAnnotation> var3) {
    this.flags = var1;
    this.annotations = var3;
    }
    1
    2
    3
    4
    flags的可取值:

    1L : public
    2L : private
    4L : protected
    8L : static
    16L : final
    32L : synchronized
    64L : volatile
    128L : transient
    256L : native
    1024L : abstract
    2048L : strictfp
    8589934592L : default
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    方法默认flags不为default,而是0L

    JCNewArray
    new数组:

    例子:String[] s = new String[]{“123”,“456”};

    JCNewArray new String[]{“123”, “456”}
    elemtype (JCExpression) = (JCIdent) String
    dims (List<JCTree.JCExpression>) 空
    elems (List<JCTree.JCExpression>) [0] = (JCLiteral) “123”
    elems (List<JCTree.JCExpression>) [1] = (JCLiteral) “456”
    例子:B[][] b = new B[3][4];

    JCNewArray new B[3][4]
    elemtype (JCExpression) = (JCIdent) B
    dims (List<JCTree.JCExpression>) [0] = (JCLiteral) 3
    dims (List<JCTree.JCExpression>) [1] = (JCLiteral) 4
    elems (List<JCTree.JCExpression>) 空
    protected JCNewArray(JCTree.JCExpression var1, List<JCTree.JCExpression> var2, List<JCTree.JCExpression> var3) {
    this.elemtype = var1;
    this.dims = var2;
    this.annotations = List.nil();
    this.dimAnnotations = List.nil();
    this.elems = var3;
    }
    1
    2
    3
    4
    5
    6
    7
    JCNewClass
    new一个对象:

    例子:new B(“123”)

    JCNewClass new B(“123”)
    clazz (JCExpression) = (JCTypeApply) B
    args (List<JCTree.JCExpression>) [0] = (JCLiteral) “123”
    protected JCNewClass(JCTree.JCExpression var1, List<JCTree.JCExpression> var2, JCTree.JCExpression var3, List<JCTree.JCExpression> var4, JCTree.JCClassDecl var5) {
    this.encl = var1;
    this.typeargs = var2 == null ? List.nil() : var2;
    this.clazz = var3;
    this.args = var4;
    this.def = var5;
    }
    1
    2
    3
    4
    5
    6
    7
    JCParens
    括号:(expr) 存在于if、计算式、synchronized中

    protected JCParens(JCTree.JCExpression var1) {
    this.expr = var1;
    }
    1
    2
    3
    JCPrimitiveTypeTree
    基本类型:

    基本类型的赋值:int i = 0 :

    typetag = INT
    方法的返回值:void print(String s) {Log.e(TAG, s);}

    typetag = VOID
    protected JCPrimitiveTypeTree(TypeTag var1) {
    this.typetag = var1;
    }
    1
    2
    3
    typetag可选值:

    INT : int
    LONG : long
    FLOAT : float
    DOUBLE : double
    DOOLEAN : boolean
    CHAR : char
    BYTE : byte
    short : short
    VOID : void
    1
    2
    3
    4
    5
    6
    7
    8
    9
    JCReturn
    return语句:return expr

    protected JCReturn(JCTree.JCExpression var1) {
    this.expr = var1;
    }
    1
    2
    3
    JCSkip
    空操作,即一个无效的分号 “;”

    JCStatement
    声明:凡是继承JCStatement都是一个声明,在JCBlock中拿到的都是JCStatement,想在JCBlock中拿到JCExpression就用JCExpressionStatement

    JCSWitch
    switch语句:switch(selector) {cases}

    protected JCSwitch(JCTree.JCExpression var1, List<JCTree.JCCase> var2) {
    this.selector = var1;
    this.cases = var2;
    }
    1
    2
    3
    4
    JCSynchronized
    synchronized同步锁:synchronized(lock){block}

    protected JCSynchronized(JCTree.JCExpression var1, JCTree.JCBlock var2) {
    this.lock = var1;
    this.body = var2;
    }
    1
    2
    3
    4
    JCThrow
    抛出异常:throw expr

    protected JCThrow(JCTree.JCExpression var1) {
    this.expr = var1;
    }
    1
    2
    3
    JCTry
    try块:try body catchers finally finalizer

    protected JCTry(List<JCTree> var1, JCTree.JCBlock var2, List<JCTree.JCCatch> var3, JCTree.JCBlock var4) {
    this.body = var2;
    this.catchers = var3;
    this.finalizer = var4;
    this.resources = var1;
    }
    1
    2
    3
    4
    5
    6
    resources不知道是什么

    JCTypeApply
    泛型参数:List list = new ArrayList<>()

    对于List list:

    clazz (JCExpression) = (JCIdent) List
    arguments (List<JCTree.JCExpression>) [0] = (JCIdent) String
    对于new ArrayList<>():

    clazz (JCExpression) = (JCIdent) ArrayList
    arguments (List<JCTree.JCExpression>) = empty
    protected JCTypeApply(JCTree.JCExpression var1, List<JCTree.JCExpression> var2) {
    this.clazz = var1;
    this.arguments = var2;
    }
    1
    2
    3
    4
    JCTypeCast
    类型转换:(clazz)expr

    例子:View textView = ((TextView) findViewById(R.id.text));

    JCTypeCast (TextView)findViewById(R.id.text)
    clazz (JCTree) = (JCIdent) TextView
    expr (JCExpression) = (JCMethodInvocation) findViewById(R.id.text)
    例子:TextView t = (TextView) textView;

    JCTypeCast (TextView)textView
    clazz (JCTree) = (JCIdent) TextView
    expr (JCExpression) = (JCIdent) textView
    protected JCTypeCast(JCTree var1, JCTree.JCExpression var2) {
    this.clazz = var1;
    this.expr = var2;
    }
    1
    2
    3
    4
    JCTypelntersection
    unknown
    泛型交叉:

    public static class A<T extends String & Runnable> {

    }
    1
    2
    3
    protected JCTypeIntersection(List<JCTree.JCExpression> var1) {
    this.bounds = var1;
    }
    1
    2
    3
    JCTypeParameter
    类的泛型定义:class

    JCTypeParameter @Anno() T extends View
    name (Name) = (NameImpl) T
    bounds (List<JCTree.JCExpression>) [0] = (JCIdent) View
    JCAnnotation @MainActivity.A()
    protected JCTypeParameter(Name var1, List<JCTree.JCExpression> var2, List<JCTree.JCAnnotation> var3) {
    this.name = var1;
    this.bounds = var2;
    this.annotations = var3;
    }
    1
    2
    3
    4
    5
    JCTypeUnion
    catch块中异常的或定义:T1 | T2 | … Tn

    try{
    ...
    }catch (ClassCastException | ArrayIndexOutOfBoundsException e){
    ...
    }
    1
    2
    3
    4
    5
    JCTypeUnion ClassCastException | ArrayIndexOutOfBoundsException
    alternatives (List<JCTree.JCExpression>) [0] = (JCIdent) ClassCastException
    alternatives (List<JCTree.JCExpression>) [1] = (JCIdent) ArrayIndexOutOfBoundsException
    protected JCTypeUnion(List<JCTree.JCExpression> var1) {
    this.alternatives = var1;
    }
    1
    2
    3
    JCUnary
    一元运算语句:i++中

    opcode = POSTINC
    arg = i (实际是JCIdent类型)
    protected JCUnary(JCTree.Tag var1, JCTree.JCExpression var2) {
    this.opcode = var1;
    this.arg = var2;
    }
    1
    2
    3
    4
    /** Unary operators, of type Unary.
    */
    POS, // +
    NEG, // -
    NOT, // !
    COMPL, // ~
    PREINC, // ++ _
    PREDEC, // -- _
    POSTINC, // _ ++
    POSTDEC, // _ --
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    JCVariableDecl
    定义变量: mods vartype name = init

    例子:final TextView textView = findViewById(R.id.text);

    JCVariableDecl final TextView textView = findViewById(R.id.text)
    mods (JCModifiers) = final
    name (Name) = (NameImpl) textView
    vartype (JCExpression) = (JCIdent) TextView
    init (JCExpression) = (JCMethodInvocation) findViewById(R.id.text)
    例子:double i = 1 + 2 * 3;

    JCVariableDecl double i = 1 + 2 * 3
    name (Name) = (NameImpl) i
    vartype (JCExpression) = (JCPrimitiveTypeTree) double
    init (JCExpression) = (JCBinary) 1 + 2 * 3
    例子:int k = cond ? 0 : 1;

    JCVariableDecl int k = cond ? 0 : 1
    init (JCExpression) = (JCConditional) cond ? 0 : 1
    protected JCVariableDecl(JCTree.JCModifiers var1, Name var2, JCTree.JCExpression var3, JCTree.JCExpression var4, VarSymbol var5) {
    this.mods = var1;
    this.name = var2;
    this.vartype = var3;
    this.init = var4;
    this.sym = var5;
    }
    1
    2
    3
    4
    5
    6
    7
    JCWhileLoop
    while循环:while(cond){body}

    为什么body不是Statement List或Block?

    protected JCWhileLoop(JCTree.JCExpression var1, JCTree.JCStatement var2) {
    this.cond = var1;
    this.body = var2;
    }
    1
    2
    3
    4
    JCWildcard
    泛型中的"?"通配符:Class<? super String> c;

    JCWildcard ? super String
    kind (TypeBoundKind) = ? super
    inner (JCTree) = (JCIdent) String
    protected JCWildcard(JCTree.TypeBoundKind var1, JCTree var2) {
    var1.getClass();
    this.kind = var1;
    this.inner = var2;
    }
    ————————————————
    版权声明:本文为CSDN博主「Lazyjam」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u013998373/article/details/90050810

  • 相关阅读:
    Circular vector
    【杂题】进制转换
    【POJ】3006
    【POJ】1503
    【POJ】2262
    【POJ】1083
    【POJ】2739
    对拍
    【POJ】2159
    【POJ】3299
  • 原文地址:https://www.cnblogs.com/exmyth/p/11396528.html
Copyright © 2011-2022 走看看