确定字段是否使用给定注释进行注释

Dav*_*ave 13 java hibernate-validator

我不知道你是否能够从标题中弄清楚我想要做什么,所以我会尝试用例子来解释

让我们假设我已经创建了自己的注释 @VerifySomething

我已经为该注释创建了测试类,以确保它的工作原理.

现在让我们假设我有一个带有注释的SomeClass字段的类something@VerifySomething

class SomeClass {
    @VerifySomething
    String something;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都那么好,但是现在我想test class为我创建SomeClass但是我没有看到任何关于验证所有测试用例的内容,因为我已经检查@VerifySomething过它在应用于测试该注释的类中应该工作,但是我需要确保该字段实际上有一个@VerifySomething注释没有复制粘贴所有这些测试用例.

所以我的问题是,有没有办法检查某个字段是否有一个或多个必需的注释,而不编写我已经在注释测试类中编写的测试用例,以确保它按预期工作.

小智 15

您可以使用它getAnnotation来确定字段上是否存在特定的注释,该注释将注释类作为参数:

field.getAnnotation( SomeAnnotation.class );
Run Code Online (Sandbox Code Playgroud)

以下是一种方法,可用于验证类是否具有由给定注释注释的字段:

import java.lang.reflect.Field;
import javax.validation.constraints.NotNull;
import org.junit.Test;
import org.springframework.util.Assert;

public class TestHasAnnotatedField {
    @Test
    public void testHasFieldsWithAnnotation() throws SecurityException, NoSuchFieldException {
        Class<?>[] classesToVerify = new Class[] {MyClass1.class, MyClass2.class};
        for (Class<?> clazz : classesToVerify) {
            Field field = clazz.getDeclaredField("something");
            Assert.notNull(field.getAnnotation(NotNull.class));
        }
    }
    static class MyClass1 { @NotNull String something; }
    static class MyClass2 { @NotNull String something; }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是添加到这个优秀的答案说,如果您定义自己的注释并且希望能够以编程方式检查它(通过“field.getAnnotation”),您需要使用“@Retention(RetentionPolicy.RUNTIME)注释您的注释声明” )`。 (5认同)