当前位置: 首页 > 知识库问答 >
问题:

通过使用反射获取带有注释的字段列表

强志学
2023-03-14

我创建我的注释

public @interface MyAnnotation {
}

我把它放在测试对象的字段上

public class TestObject {

    @MyAnnotation 
    final private Outlook outlook;
    @MyAnnotation 
    final private Temperature temperature;
     ...
}

现在我想用MyAnnotation获取所有字段的列表。

for(Field field  : TestObject.class.getDeclaredFields())
{
    if (field.isAnnotationPresent(MyAnnotation.class))
        {
              //do action
        }
}

但我的block do操作似乎从未执行过,字段没有注释,因为下面的代码返回0。

TestObject.class.getDeclaredField("outlook").getAnnotations().length;

有人能帮我,告诉我做错了什么吗?

共有2个答案

糜野
2023-03-14
/**
 * @return null safe set
 */
public static Set<Field> findFields(Class<?> classs, Class<? extends Annotation> ann) {
    Set<Field> set = new HashSet<>();
    Class<?> c = classs;
    while (c != null) {
        for (Field field : c.getDeclaredFields()) {
            if (field.isAnnotationPresent(ann)) {
                set.add(field);
            }
        }
        c = c.getSuperclass();
    }
    return set;
}
丁念
2023-03-14

您需要将注释标记为在运行时可用。将以下内容添加到注释代码中。

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
 类似资料:
  • 问题内容: 我创建我的注释 我把它放在测试对象的字段上 现在,我想使用获取所有字段的列表。 但是似乎我的block do操作从未执行过,并且字段没有注释,因为以下代码返回0。 有谁可以帮助我,告诉我我做错了什么? 问题答案: 您需要将注释标记为在运行时可用。将以下内容添加到您的注释代码中。

  • 问题内容: 我试图通过反射接收字段值。问题是我不知道字段类型,必须在获取值时确定它。 这段代码会导致以下异常: 无法将java.lang.String字段com .... fieldName设置为java.lang.String 我尝试进行转换,但出现编译错误: 要么 我怎样才能做到这一点? 问题答案: 像之前回答的那样,你应该使用: 有时更喜欢的另一种方法是动态调用getter。示例代码: 还应

  • 问题内容: 我创建了一个简单的注释类: 我在像这样的一些类中使用它: 我知道我可以遍历声明的字段并获得如下注释: 如何在不迭代类的声明字段的情况下直接通过带注释的名称获取字段? 问题答案: 如果需要进行多次访问,则可以预处理注释。

  • 问题内容: 我无法获取字段值。我想做的是在运行时获取对象。请让我知道我要去哪里了。 测试类 } EX.class } 问题答案: 像这样 或者,您可以使用类的方法在运行时获取对象的实例。您仍然需要首先设置该实例变量,否则它将没有任何值。 例如 或者,在其构造函数中有两个参数的地方,例如String和int … 或者您可以在运行时使用它为其构造函数查询 注意:我特意省略了将在此创建的对象强制转换为预

  • 我有一个方法,它返回字符串类型的字段对象列表。 这个方法应该将所有字符串字段都大写: 问题是:"field.set(...)"不起作用。它应该将值大写并将其设置为该字段的新值,但它不起作用...我如何解决这个问题的任何想法?(PS:在真正的代码中,"something Class.class"被设置为真正的类名...) 正在生成的错误是field.get(this)方法(insdefield.se

  • 问题内容: 我正在尝试获取对象的第一个父项的字段和值。我当前的代码是这样的: 我的课程结构与此类似: 现在,我将一个C对象传递给该方法,并且我想从C和B中获取所有字段,而不是从A中获取所有字段。有没有办法做到这一点(使用反射,我不想实现其他方法)? 问题答案: Luchian,使用getSuperclass()方法获取对Class对象的引用,该对象表示所讨论对象的超类类型。之后,您可以像在示例中一