2010-07-11 50 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對象的字段不會告訴您正確的值(至少不是總是)。但是,檢查所需方法的返回值應該給出正確的值。