2010-07-11 6 views
0

J'ai java un bean Java simple avec 4 attributs, getter/setter, et quelques méthodes overided comme toString, equals et hashCode.Java réflexion (et annotations): bean.class est vide

Au-dessus de chaque attribut est une annotation personnalisée:

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; 

Si je passe le bean.class à une autre méthode

generateEntity(User.class); 

...

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

et le déboguer, il semble être vide, sauf pour le nom de la classe. Tous les tableaux tels que les méthodes, les annotations et les champs sont de taille nulle.

Où est-ce que je me suis trompé?

Répondre

0

Utilisez beanClass.getDeclaredFields() au lieu de getFields(). Puis itérer le tableau et pour chaque Field appel getAnnotations()

getFields() (et les méthodes similaires) retourner uniquement les membres du public. Quoi qu'il en soit, pourquoi n'utilisez-vous pas JPA au lieu de créer vos propres annotations et processeurs d'annotations?

+0

Odd, je pourrais jurer le tableau declareFields est également de taille zéro, si je llok au bean au débogueur, mais en quelque sorte cela fonctionne. Merci beaucoup, Bozho. Il s'agit d'un exercice pour UAS. L'intention principale est la mise en œuvre d'un générateur de code avec emf et jet. – masche

0

Ne regardez pas les champs internes de la classe. Ils ne sont pas pertinents pour vous. La seule chose qui devrait vous intéresser sont les valeurs de retour des méthodes. Il est très probable que java.lang.Class utilise ces champs pour stocker des informations créées à la demande.

Dans ce cas, en regardant les champs de l'objet Class lors de l'exécution ne vous dira pas les bonnes valeurs (du moins pas toujours). Inspecter les valeurs de retour des méthodes souhaitées, cependant, devrait donner les bonnes valeurs.