当前位置: 首页 > 面试题库 >

如何访问Java自定义注释中定义的字段

翟光赫
2023-03-14
问题内容

我有以下Java代码-

import java.lang.reflect.Field;

public class AnnotationTest
{
    public @interface Size
    {
        int size();
        int location();
    }

    @Size(size = 40, location = 85)
    private String firstName;

    @Size(size = 1, location = 21)
    private String middleInitial;

    @Size(size = 50, location = 115)
    private String lastName;

    public static void main(String[] args)
    {
        AnnotationTest t = new AnnotationTest();

        Class<? extends AnnotationTest> classInstance = t.getClass();

        for (Field f : classInstance.getDeclaredFields())
        {
            Size s = f.getAnnotation(Size.class); 
            int size = s.size(); // this is line 29
            int location = s.location();

            System.out.println("size = "+ size);
            System.out.println("location = "+location);
        }

    }
}

我得到的错误是

Exception in thread "main" java.lang.NullPointerException
    at com.stackoverflowx.AnnotationTest.main(Demo.java:125

如何正确访问注释字段?


问题答案:

默认情况下,注释在运行时不可用。您需要添加@Retention(RetentionPolicy.RUNTIME)到注释定义以使其可用于运行时处理。例如:

@Retention(RetentionPolicy.RUNTIME)
public @interface Size {

在实践中,还应Field.isAnnotationPresent在实际尝试从字段中删除注释之前,检查该字段是否确实具有给定的注释。

另外,指定注释所属的元素类型也是一种好习惯@Target。因此,您的示例将是:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Size {


 类似资料:
  • 我想用java为创建自定义注释。我想用这个注释比较两个字符串值,比较后会返回一个

  • 我有一个实体类称为和一个仓库声明如下: 自定义存储库的定义如下: 和 下面是另一个堆栈溢出问题中描述的内容:如何向Spring数据JPA添加自定义方法 现在,IntelliJ给了我一个警告: 我尝试将这些注释添加到中,但没有一个成功: 但都不管用。显然有些是错的,但我在试验。正确的注释是什么。 使用,我得到了以下错误:

  • 下面是Lombok的注释的java文档: 如果加上一个参数,lombok将在方法/构造函数主体的开头插入一个空检查,抛出一个{@code NullPointerException},参数名作为消息。如果放在字段上,任何为该字段赋值的生成方法也将生成这些空检查。请注意,任何名为{@code NonNull}且带有任何大小写和任何包的注释都将导致为生成的方法生成nullchecks(并且注释将被复制到

  • 我有一个自定义注释,如下所示 我定义了一个方面来包装实际的方法调用 注释的用法如下所示 到目前为止,这工作得很好,我可以在TestableAspect#InvkeAndLog中实现我的登录。 现在我需要验证eg的索引值不大于10。 我可以在运行时通过更改方面实现来实现,如下所示 但这需要至少调用一次API,而且效率不高。是否有一种方法可以在spring启动应用程序启动时执行此操作?

  • 问题内容: 我为我写了一个 对于每个我使用以下注释 因此,我决定定义自己的注释女巫,其中包含所有这样的注释 然后,我只用了一个注释 修改后,测试失败 为了使其再次工作,需要我将其添加到 我的问题是为什么我的注释包含注释时不起作用?注释有什么特别之处吗?还是我错过了什么? PS:我使用相同的方法,它们也很好用。 问题答案: 这种机制是Spring框架特有的,在这种机制中,您可以使用本身带有其他注释的