我定义了一个注释:
public @interface AdminMapping {
public final static int USER = 100;
public final static int COMPANY = 10;
public final static int ADMIN = 0;
int adminLevel() default AdminMapping.USER;
String displayName();
String category() default "";
String hasPermission() default "";
String parentCategory() default "";
}
我想这样做,所以你不能拥有一个parentCategory,除非你有一个类别....
@AdminMapping(category="Company", displayName="FOO", adminLevel=AdminMapping.USER)
public static final String MONKEY = "chimp";
@AdminMapping(parentCategory="Company", displayName="BAR", adminLevel=AdminMapping.USER) //NOT VALID Parent without Category
public static final String HORSE = "zebra";
当我在它的时候我也喜欢它,如果我能做到这样,那么类别不等于parentCategory。
我知道如何使用ConstraintValidator来验证MONKEY和HORSE,但我想验证实际的AdminMapping条目。这可以在编译时完成吗?
感谢任何帮助。
答案 0 :(得分:1)
您需要获取对注释的引用并检查其属性
AdminMapping mapping = ...; // depends on what your annotation is annotating
if (mapping.category().isEmpty()) {
if (!mapping.parentCategory().isEmpty()) {
// we got a beef
}
}
答案 1 :(得分:1)
使用PMD。 PMD是一种解析源代码的工具,可以让您检查它是否符合某些规则。它带有许多内置规则,但您可以编写自己的规则,以便编写规则来检查注释是否按照您的需要定义。
有关编写自己规则的说明,请参阅this page。
例如,很容易编写一个规则来检查注释是否同时定义了parentCategory和category。
首先在规则xml文件中声明自定义规则:
<?xml version="1.0"?>
<ruleset name="My custom rules"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<rule name="NoParent"
message="No parent category without category"
class="com.test.CategoryRule">
<description>
No parent category without category
</description>
</rule>
然后定义一个将执行实际执行的Java类。
public class CategoryRule extends AbstractJavaRule {
public Object visit(ASTMemberValuePairs node, Object data) {
boolean hasCategory = false;
boolean hasParentCategory = false;
for ( int i = 0; i < node.jjtGetNumChildren(); ++i ) {
if ( node.jjtGetChild(i).getImage().equals("category") ) {
hasCategory = true;
} else if ( node.jjtGetChild(i).getImage().equals("parentCategory") ) {
hasParentCategory = true;
}
}
if ( hasCategory && !hasParentCategory ) {
addViolation(data, node);
}
return data;
}
}
显然,您需要编写代码以在实际中更加健壮,检查注释类型,但希望这足以让您入门。