gpt4 book ai didi

java - 如何在编译时验证注释?

转载 作者:行者123 更新时间:2023-12-02 06:39:54 25 4
gpt4 key购买 nike

我定义了一个注释:

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";

当我这样做时,如果我能让类别不等于父类别,我也希望它。

我知道如何使用 ConstraintValidator 来验证 MONKEY 和 HORSE,但我想验证实际的 AdminMapping 条目。这可以在编译时完成吗?

感谢任何帮助。

最佳答案

使用PMD 。 PMD 是一个解析源代码并让您检查它是否符合某些规则的工具。它带有许多内置规则,但您可以编写自己的规则,这样您就可以编写规则来检查您的注释是否按照您想要的方式定义。

参见this page了解如何编写自己的规则。

例如,很容易编写一条规则来检查注释是否同时定义了parentCategory和类别。

首先在规则 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;
}

}

显然,您需要编写代码以使其在现实中更加健壮,检查注释类型,但希望这足以让您开始。

关于java - 如何在编译时验证注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19252973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com