JCTree简要分析

[toc]

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;
}

JCCatch

catch捕捉异常:catch(param) body

  • param 定义异常变量 Exception e
  • body 代码块
protected JCCatch(JCTree.JCVariableDecl var1, JCTree.JCBlock var2) {
this.param = var1;
this.body = var2;
}

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);
} }
  • mods (JCModifiers) = public
  • name (Name) = (NameImpl) MainActivity
  • extending (JCExpression) = (JCIdent) AppCompatActivity
  • implementing (JCExpression) 实现的接口
  • defs (List<JCTree>) :
  • defs(1) : JCMethodDecl
    public <init>() {
    super();
    }
  • defs(2) : JCBlock
    static {
    kk = 2;
    }
  • defs(3) : JCVariableDecl
    private int kk = 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();
    }
  • 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;
}

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:
}
}

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;
}

JCContinue

continue跳过一次循环,与break相似:continue label

protected JCContinue(Name var1, JCTree var2) {
this.label = var1;
this.target = var2;
}

JCDoWhileLoop

do-while循环:do{body}while(cond)

protected JCDoWhileLoop(JCTree.JCStatement var1, JCTree.JCExpression var2) {
this.body = var1;
this.cond = var2;
}

JCEnhancedForLoop

增强循环:for(var : expr) body

例如:

for (String s : list) {
print(s);
}
  • 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;
}

JCErroneous

Error trees

JCExpression

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

JCExpressionStatement

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

protected JCExpressionStatement(JCTree.JCExpression var1) {
this.expr = var1;
}

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;
}

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;
}

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;
} }

其中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;
}

JCImport

import语句:

  • import qulid
  • static (if staticImport) import qulid
protected JCImport(JCTree var1, boolean var2) {
this.qualid = var1;
this.staticImport = var2;
}

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;
}

JCLabeledStatement

带有标签的语句:label : body

protected JCLabeledStatement(Name var1, JCTree.JCStatement var2) {
this.label = var1;
this.body = var2;
}

JCLambda

lambda表达式:此处表达式主体只有一句表达式

textView.setOnClickListener(v -> v.setVisibility(View.INVISIBLE));
  • 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);
});
  • body (JCTree) = (JCBlock) {v.setVisibility(View.VISIBLE);}
  • getBodyKind() (BodyKind) = STATEMENT

当参数v指明类型为View时:

textView.setOnClickListener((View v) -> v.setVisibility(View.INVISIBLE));
  • 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;
}

typetag的可选值有:

INT : int
LONG : long
FLOAT : float
DOUBLE : double
CHAR : char
CLASS : String
BOT : null

JCMemberReference

lambda表达式中的方法引用:expr::name

例子:new B<String>("123").setObjectUtil(ObjectUtil::new);

  • JCMemberReference ObjectUtil::new
  • mode (ReferenceMode) = NEW
  • name (Name) = (NameImpl) <init>
  • expr (JCExpression) = (JCIdent) ObjectUtil

例子:new B<String>("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;
}

JCMethodDecl

方法的定义:

例子:

@Reality
private static <T extends String> int print(@NonNull final String s) throws RuntimeException {
Log.e(TAG, s);
return 1;
}
  • 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) = <T>print(java.lang.String)

例子:

@Reality
@interface B {
int value() default 1;
}
  • 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;
}

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;
}

JCModifiers

类、变量、方法等的修饰符和注解:例如:

@Reality private static final String TAG = "MainActivity";
  • 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;
}

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

方法默认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<String>[][] 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;
}

JCNewClass

new一个对象:

例子:new B<String>("123")

  • JCNewClass new B<String>("123")
  • clazz (JCExpression) = (JCTypeApply) B<String>
  • 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;
}

JCParens

括号:(expr) 存在于if、计算式、synchronized中

protected JCParens(JCTree.JCExpression var1) {
this.expr = var1;
}

JCPrimitiveTypeTree

基本类型:

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

  • typetag = INT

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

  • typetag = VOID
protected JCPrimitiveTypeTree(TypeTag var1) {
this.typetag = var1;
}

typetag可选值:

INT : int
LONG : long
FLOAT : float
DOUBLE : double
DOOLEAN : boolean
CHAR : char
BYTE : byte
short : short
VOID : void

JCReturn

return语句:return expr

protected JCReturn(JCTree.JCExpression var1) {
this.expr = var1;
}

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;
}

JCSynchronized

synchronized同步锁:synchronized(lock){block}

protected JCSynchronized(JCTree.JCExpression var1, JCTree.JCBlock var2) {
this.lock = var1;
this.body = var2;
}

JCThrow

抛出异常:throw expr

protected JCThrow(JCTree.JCExpression var1) {
this.expr = var1;
}

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;
}

resources不知道是什么

JCTypeApply

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

对于List<String> 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;
}

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;
}

JCTypelntersection

unknown

泛型交叉:

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

}
protected JCTypeIntersection(List<JCTree.JCExpression> var1) {
this.bounds = var1;
}

JCTypeParameter

类的泛型定义:class<annotations name bounds>

  • 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;
}

JCTypeUnion

catch块中异常的或定义:T1 | T2 | ... Tn

try{
...
}catch (ClassCastException | ArrayIndexOutOfBoundsException e){
...
}
  • 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;
}

JCUnary

一元运算语句:i++中

  • opcode = POSTINC
  • arg = i (实际是JCIdent类型)
protected JCUnary(JCTree.Tag var1, JCTree.JCExpression var2) {
this.opcode = var1;
this.arg = var2;
}
/** Unary operators, of type Unary.
*/
POS, // +
NEG, // -
NOT, // !
COMPL, // ~
PREINC, // ++ _
PREDEC, // -- _
POSTINC, // _ ++
POSTDEC, // _ --

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;
}

JCWhileLoop

while循环:while(cond){body}

为什么body不是Statement List或Block?

protected JCWhileLoop(JCTree.JCExpression var1, JCTree.JCStatement var2) {
this.cond = var1;
this.body = var2;
}

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;
}

java AST JCTree简要分析的更多相关文章

  1. [Java] Hashtable 源码简要分析

    Hashtable /HashMap / LinkedHashMap 概述 * Hashtable比较早,是线程安全的哈希映射表.内部采用Entry[]数组,每个Entry均可作为链表的头,用来解决冲 ...

  2. [Java] LinkedHashMap 源码简要分析

    特点 * 各个元素不仅仅按照HashMap的结构存储,而且每个元素包含了before/after指针,通过一个头元素header,形成一个双向循环链表.使用循环链表,保存了元素插入的顺序. * 可设置 ...

  3. [Java] HashMap 源码简要分析

    特性 * 允许null作为key/value. * 不保证按照插入的顺序输出.使用hash构造的映射一般来讲是无序的. * 非线程安全. * 内部原理与Hashtable类似.   源码简要分析 pu ...

  4. Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析

    原文发表于 2013 年 8 月 28 日 由 三石 根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给出了Fork Join的实现.在Java SE 7的API中,多了ForkJoin ...

  5. [转]Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp85   根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给 ...

  6. Java 线程池原理分析

    1.简介 线程池可以简单看做是一组线程的集合,通过使用线程池,我们可以方便的复用线程,避免了频繁创建和销毁线程所带来的开销.在应用上,线程池可应用在后端相关服务中.比如 Web 服务器,数据库服务器等 ...

  7. Android Hal层简要分析

    Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...

  8. RxJava && Agera 从源码简要分析基本调用流程(2)

    版权声明:本文由晋中望原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/124 来源:腾云阁 https://www.qclo ...

  9. MapReduce启动的Map/Reduce子任务简要分析

      对于Hadoop来说,是通过在DataNode中启动Map/Reduce java进程的方式来实现分布式计算处理的,那么就从源码层简要分析一下hadoop中启动Map/Reduce任务的过程.   ...

随机推荐

  1. Oracle的ole db连接字符串

    Provider=msdaora;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.59.22)(PO ...

  2. [LeetCode] 150. Evaluate Reverse Polish Notation 计算逆波兰表达式

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  3. LeetCode:第K个排列【60】

    LeetCode:第K个排列[60] 题目描述 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: &quo ...

  4. TCP/IP学习笔记3--传输方式的分类

    网络通信中有多中分类方法: )分组较短.出错几率降低,每次重发的数据量也降低,不仅提高了可靠性,也降低了时延.缺点:(1)因为数据进入交换节点后要经历存储转发这一过程,从而引起的转发时延(包含接受分组 ...

  5. linux centos7开机自动启动程序实现

    1存放脚本位置 /etc/init.d/ServerManagerCLI.sh 该脚本是自己新建的内容参看2 增加执行权限 chmod +x /etc/rc.d/init.d/ServerManage ...

  6. docker自动化脚本

    使用脚本从git上拉取项目并运行, 有些不足的地方 编写脚本 run.sh 如果用到redis和myslq,要先启动redis和mysql #!/bin/bash # author:qiao # 更新 ...

  7. quartz2.3.0(六)job任务异常处理方式

    Job1类 package org.quartz.examples.example6; import org.quartz.DisallowConcurrentExecution; import or ...

  8. golang ---CPU信息

    package main import ( "fmt" "github.com/StackExchange/wmi" ) type gpuInfo struct ...

  9. webapi session

    webapi中使用session 修改global.cs里面的内容 using System; using System.Web; using System.Web.Routing; using Sy ...

  10. Java CPU占用过高问题排查,windows和Linux

    LINUX系统: linux系统比较简单: 1.使用命令 ps -ef | grep 找出异常java进程的pid.  找出pid为 20189 2. top -H -p 20189,所有该进程的线程 ...