2010-07-11 55 views
0

我用一个简单的Java bean来描述一个具有4个属性的getter/setter和一些overString方法,比如toString,equals和hashCode。Java反射(和注释):bean.class是空的

以上每个属性是一个自定义注释:

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) {...} 

并调试它,它似乎是空的,除了班级名称。所有数组像方法,注释和字段都是零大小。

我哪里错了?

回答

0

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

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

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

+0

奇怪的是,我可以发誓声明数组declareFields的大小也是零,如果我在调试器的bean上,但它以某种方式工作。 非常感谢Bozho。 这是一个UAS的excersise。主要目的是使用emf和jet实现代码生成器。 – masche 2010-07-11 09:48:56

0

不要看类的内部字段。它们与你无关。唯一值得关注的是方法的返回值。很有可能java.lang.Class使用这些字段来存储按需创建的信息。

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