名称描述值类型示例DSL 规则name方法名字符串new MethodRefTypeTest();objectCreationExpression obc where obc.name == “MethodRefTypeTest”;type返回值类型objectType节点new MethodRefTypeTest();objectCreationExpression obc where obc.type.name == “com.huawei.secbrella.kirin.test.sourcefile.methodRefType.MethodRefTypeTest”;function调用的构造方法functionDeclaration节点public class MethodRefTypeTest {
MethodRefTypeTest() {}
public static void main(String[] args) {
new MethodRefTypeTest();
}objectCreationExpression obc where obc.function.name == “MethodRefTypeTest”;arguments入参聚集valueAccess类节点、functionCall节点等的聚集new String(“Hello”);objectCreationExpression obc where
obc.arguments.size() == 1;arguments[n]第n个入参valueAccess类节点、functionCall节点等的聚集new String(“Hello”);objectCreationExpression obc where
obc.arguments[0].value == “Hello”;3.2. 强制类型转换(castExpression)
类型强制转换(Type Casting)是指将一个类型的对象转换成另一个类型的对象。
代码样例
double d = 10.5;
// 强制转换,需要显式指定目标类型
int i = (int) d;
Object obj = new String("Hello");
// 安全的向下转型
String str = (String) obj;
复制代码
图例
名称描述值类型示例DSL 规则castType目标类型nodeArrayList second = (ArrayList) list;castExpression ce where ce.castType.name == “java.util.ArrayList”;operand操作对象nodeArrayList second = (ArrayList) list;castExpression ce where ce.operand.name == “list”;3.3. 类型判断表达式(instanceofExpression)
instanceof 关键字用于检查一个对象是否是特定类的实例大概是其子类的实例。
代码样例
if (animal instanceof Dog) {
((Dog) animal).makeSound();
}
Object[] objects = new Object[10];
if (objects instanceof Object[]) {
System.out.println("objects is an array of Object");
}
复制代码
图例
名称描述值类型示例DSL 规则lhs左值任意节点father instanceof FatherinstanceofExpression ie where ie.lhs.name == “father”;rhs右值,类型值全类名常量list instanceof ListinstanceofExpression ie where ie.rhs.name == “java.util.List”;3.4. 一元表达式(unaryOperation)
int resultBitwiseAnd = number & 3; // 结果是 1, 因为 101 & 011 = 001
int resultBitwiseOr = number | 3; // 结果是 7, 因为 101 | 011 = 111
int resultBitwiseXor = number ^ 3; // 结果是 2, 因为 101 ^ 011 = 110
int resultLeftShift = number << 1; // 结果是 10, 因为 101 向左移动一位变成 1010
int resultRightShift = number >> 1; // 结果是 2, 因为 101 向右移动一位变成 10
int resultRightShiftLogical = number >>> 1; // 结果是 2, 逻辑右移,忽略符号位
// 赋值二元表达式
// 简单赋值:x = y
// 加等于:x += y
// 减等于:x -= y
// 乘等于:x *= y
// 除等于:x /= y
// 模等于:x %= y
// 位与等于:x &= y
// 位或等于:x |= y
// 位异或等于:x ^= y
// 位左移等于:x <<= n
// 位右移等于:x >>= n
// 位右移逻辑等于:x >>>= n
int num = 5;
num += 3; // num 现在是 8
num *= 2; // num 现在是 16
num /= 4; // num 现在是 4
num %= 3; // num 现在是 1
复制代码
图例
名称描述值类型示例DSL 规则lhs二元表达式的左值literal类节点、valueAccess类节点、functionCall类节点int i = 1;binaryOperation bo where bo.lhs.name == “i”;operator二元表达式的操作符字符串while (i == 1)binaryOperation bo where bo.operator == “==”;rhs二元表达式的右值literal类节点、valueAccess类节点、functionCall类节点a > b;binaryOperation bo where bo.rhs.name == “b”;operands二元表达的操作对象(左值和右值)节点聚集a > b;binaryOperation bo where
bo.operands contain op where op.name == “a”;3.6. 条件表达式/三目运算(ternaryOperation)
条件表达式,也称为三目运算符(Ternary Operator),是一种简洁的条件语句,格式如下:
result = condition ? value_if_true : value_if_false;
名称描述值类型示例DSL 规则parameters参数paramDeclaration节点list.forEach(integer -> {
if (integer == 1) {
System.out.println(“单数”);
}
});lambdaExpression le where
le.parameters contain p where p.name == “integer”;body方法体block语句块list.forEach(integer -> {
if (integer == 1) {
System.out.println(“单数”);
}
});lambdaExpression le where
le.body contain variableAccess va where va.name == “integer”;body.statementNum语句数量数值list.forEach(integer -> {
if (integer == 1) {
System.out.println(“单数”);
}
});lambdaExpression le where
le.body.statementNum == 1;firstStatement第一条语句任意节点list.forEach(integer -> {
if (integer == 2) {
System.out.println(“单数”);
}
});lambdaExpression le where
le.firstStatement contain ifBlock;lastStatement末了一条语句任意节点list.forEach(integer -> {
if (integer == 3) {
System.out.println(“单数”);
}
System.out.print(“双数”);
});lambdaExpression le where
le.lastStatement contain functionCall fc where fc.name == “print”;3.9. 匿名内部类表达式(anonymousInnerClassExpression)