我再次使用
创建的Java ASTpublic class Test {
String o = new String("hh");
public void wrong1() {
synchronized(o) {
// huhu
}
}
}
我尝试创建一个XPath查询,该查询查找使用已定义的String变量o
的synchronized块。
由于定义在上面,它是SynchronizedStatement的祖先,但我不能让它工作
//SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image=ancestor::ClassOrInterfaceBody[ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image]]]
我知道/SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image=
是正确的,我的问题是如何解决祖先ClassOrInterfaceBody部分。
希望明确我的意思; - )
由于
答案 0 :(得分:2)
测试两个@Image是否相同。
//SynchronizedStatement[ Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image ]
还要测试String类型,假设FieldDeclaration和FieldVariableDeclaratorId具有公共属性(名称)。
//SynchronizedStatement[
Expression/PrimaryExpression/PrimaryPrefix/Name/@Image =
ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId[
@name = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration[Type/ReferenceType/ClassOrInterfaceType/@Image = 'String']/@name
]/@Image
]
如果原始XPath中的@Image是“String”:
//SynchronizedStatement[ Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image[. = 'String'] ]