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

2022-09-04 01:22:56

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

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

我为该注释创建了测试类,以确保它有效。

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

class SomeClass {
    @VerifySomething
    String something;
}

到目前为止,一切都很好,但现在我想为我创建,但是我看不出验证某些东西的所有测试用例有任何意义,因为我已经检查过,在课堂上应该工作,测试该注释,但是我需要确保该字段实际上具有注释,而无需复制粘贴所有这些测试用例。test classSomeClass@VerifySomething@VerifySomething

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


答案 1

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

field.getAnnotation( SomeAnnotation.class );

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

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

答案 2

我不确定我是否在关注,但是如果您想验证类和/或其属性是否具有给定的Bean Validation约束,则可以使用元数据API。入口点是 Validator#getConstraintsForClass(SomeClass.class)。你会得到一个BeanDescriptor。从那里你可以做_beanDescriptor#getConstraintsForProperty(“something”),它给你一个属性描述符。通过 propertyDescriptor#getConstraintDescriptors() 您可以获得一组 ConstraintDescriptors,您可以对其进行迭代以验证是否使用了给定的约束注释。

请注意,与上面的答案中的通用反射相比,这是一个特定于Bean验证的解决方案,但这取决于您真正想要的是什么。说实话,我还不太理解你的用例。


推荐