Java 如何在编译时验证注释?
我定义了一个注释:Java 如何在编译时验证注释?,java,annotations,Java,Annotations,我定义了一个注释: 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
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 "";
}
我想让你不能有一个父类别,除非你有一个类别
@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";
当我这么做的时候,如果我能做到的话,我也希望这样,这样类别就不等于父类别了
我知道如何使用ConstraintValidator验证MONKEY和HORSE,但我想验证实际的AdminMapping条目。这可以在编译时完成吗
非常感谢您的帮助。您需要获取注释的引用并检查其属性
AdminMapping mapping = ...; // depends on what your annotation is annotating
if (mapping.category().isEmpty()) {
if (!mapping.parentCategory().isEmpty()) {
// we got a beef
}
}
使用。PMD是一种分析源代码并让您检查其是否符合某些规则的工具。它有很多内置规则,但您可以编写自己的规则,这样您就可以编写规则来检查注释的定义方式
有关编写自己的规则的说明,请参阅
例如,编写检查注释是否同时定义了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;
}
公共类CategoryRule扩展了AbstractJavaRule{
公共对象访问(ASTMemberValuePairs节点,对象数据){
布尔hascape=false;
布尔hasParentCategory=false;
for(int i=0;i
}
显然,您需要编写更健壮的代码,检查注释类型,但希望这足以让您开始使用。@kasdega必须编写自己的编译器。您可以为IDE实现一些代码检查器插件。我还没有尝试确认您可以做任何您想做的事情,但我建议您考虑编写自己的PMD规则来进行检查。@matthelliwell下面的一个示例部分的答案可能会对我有很大帮助并得到认可:)我可以知道解决方案@kasdega吗