【问题标题】:Java reflection (and annotations): bean.class is emptyJava 反射(和注释):bean.class 为空
【发布时间】:2010-07-13 03:16:29
【问题描述】:

我创建了一个简单的 Java bean,它有 4 个属性、getter/setter 以及一些覆盖方法,例如 toString、equals 和 hashCode。

每个 Attribute 之上都是一个自定义 Annotation:

import java.lang.annotation.*;
import java.lang.annotation.RetentionPolicy;

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

    String name();
    String type();
    boolean identifier() default false;

}

/** The id. */
@DAOProperty(name = "id", type = "long", identifier = true)
private long id;

如果我将 bean.class 传递给另一个方法

generateEntity(User.class);

...

private static MEntity generateEntity(Class<?> bean) {...}

并调试它,除了类名之外,它似乎是空的。方法、注释和字段等所有数组的大小为零。

我哪里做错了?

【问题讨论】:

    标签: java reflection annotations


    【解决方案1】:

    使用beanClass.getDeclaredFields() 代替getFields()。然后迭代数组并为每个Field调用getAnnotations()

    getFields()(和类似的方法)只返回公共成员。

    无论如何,你为什么不使用 JPA,而不是创建自己的注解和注解处理器?

    【讨论】:

    • 奇怪,我可以发誓数组声明字段的大小也为零,如果我在调试器上查看 bean,但它以某种方式工作。非常感谢,博卓。这是 UAS 的练习。主要目的是用 emf 和 jet 实现代码生成器。
    【解决方案2】:

    不要查看类的内部字段。它们与您无关。您唯一应该感兴趣的是方法的返回值。 java.lang.Class 很可能使用这些字段来存储按需创建的信息。

    在这种情况下,在运行时查看 Class 对象的字段不会告诉您正确的值(至少并非总是如此)。然而,检查所需方法的返回值应该给出正确的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多