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吗