编译时注解从入门到精通(五)

本篇文章是以方法元素(element)为主体进行探讨的。为了简化代码,我把方法元素的两个兄弟提前声明出来:

1
2
3
4
5
// 方法的标识
Symbol.MethodSymbol methodSym = (Symbol.MethodSymbol) element;

// 类的声明
JCTree.JCMethodDecl methodDecl = (JCTree.JCMethodDecl) trees.getTree(element);

查询相关

获取方法名

1
2
3
4
5
6
7
8
/**
* 获取方法名
*
* @return 返回方法名
*/
public String getMethodName() {
return methodSym.name.toString();
}

获取方法的返回类型

1
2
3
4
5
6
7
8
/**
* 获取方法的返回类型
*
* @return 返回方法的返回类型
*/
public JCTree.JCExpression getReturnType() {
return methodDecl.restype;
}

判断方法是否有返回值

1
2
3
4
5
6
7
8
/**
* 判断方法是否有返回值
*
* @return 有则返回true,否则返回false
*/
public boolean hasReturnValue() {
return !"void".equals(getReturnType().getObject().toString());
}

获取方法的参数

1
2
3
4
5
6
7
8
/**
* 获取方法的参数
*
* @return 返回方法的参数
*/
public com.sun.tools.javac.util.List<Symbol.VarSymbol> getArgs() {
return methodSym.params;
}

判断方法是不是有指定修饰符

1
2
3
4
5
6
7
8
/**
* 判断方法是不是有指定修饰符
*
* @return 如果方法有某个修饰符的返回true,否则返回false
*/
public boolean hasModifier(int modifier) {
return methodDecl.mods.flags % (modifier * 2) >= modifier;
}

修改相关

在方法第一行插入一个表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 在方法第一行插入一个表达式
*
* @param express 表达式
*/
public void insert(JCTree.JCExpression express) {
ListBuffer<JCTree.JCStatement> statements = new ListBuffer<>();

statements.append(treeMaker.Exec(express));
for (JCTree.JCStatement statement : methodDecl.body.stats) {
statements.append(statement);
}
methodDecl.body.stats = statements.toList();
}

在方法第一行插入一个代码块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 在方法第一行插入一个代码块
*
* @param statement 代码块
*/
public void insertBlock(JCTree.JCStatement statement) {
ListBuffer<JCTree.JCStatement> statements = new ListBuffer<>();

statements.append(statement);
for (JCTree.JCStatement stat : methodDecl.body.stats) {
statements.append(stat);
}
methodDecl.body.stats = statements.toList();
}

设置方法的修饰符

1
2
3
4
5
6
7
8
 /**
* 设置方法的修饰符
*
* @param modifier 修饰符
*/
public void setModifier(int modifier) {
methodDecl.mods.flags = modifier;
}

更多用法请参考:https://github.com/ofofs/jca.git