2010-12-14 3 views
3

je dois écrire un programme utilitaire qui accepterait un HashMap vide et tout objet comme arguments et retourner le HashMaplecture récursive tout objet java et en tirant des types complexes en une carte de hachage

public HashMap returnMap(HashMap map,Object parseThisObject){ 

//logic to strip all children, children of children...... and place it in HashMap 
//return map 

} 

Cet objet contient une beaucoup d'objets dedans et ces objets dedans ont beaucoup d'enfants et la lignée continue. Mon utilitaire doit être assez générique pour lire récursivement tous les enfants jusqu'à ce qu'il rencontre des primitives dans chaque objet, placez chacun de ces objets dans la carte de hachage et renvoyez-le. C'est quelque chose comme le parent serait là sur la carte. mais les enfants individuels seraient également là comme entrées subséquentes sur la carte.

Je suis nouveau à la réflexion java et je suis passé par quelques tutoriels et exemples sur le net. Pas très confiant sur la façon de procéder. Je crois que c'est l'une des exigences fréquentes auxquelles les experts et les professionnels ont pu faire face.

Merci de me donner un point de départ à ce sujet. S'il existe des utilitaires bean open source disponibles pour le faire? Si oui, faites le moi savoir.

Répondre

5

Quelque chose comme ça devrait le faire:

public void fillMap(HashMap<String, Object> map, Object bean) { 
    try { 
     BeanInfo info = Introspector.getBeanInfo(bean.getClass()); 
     PropertyDescriptor[] props = info.getPropertyDescriptors(); 
     for (int i = 0; i < props.length; i++) { 
      Method reader = props[i].getReadMethod(); 
      if (reader != null && !props[i].getName().equals("class")) { 
       Object invoke = reader.invoke(bean, new Object[] {}); 
       if (invoke != null) { 
        if (!reader.getReturnType().isPrimitive()) { 
         fillMap(map, invoke); 
        } else { 
         map.put(props[i].getName(), invoke); 
        } 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Bien sûr, cela met tous les champs de tous les objets dans une carte. Vous devrez peut-être créer une carte pour chaque étape de récursivité si vous voulez des sous-ensembles pour les enfants. Je peux aussi vous donner ce code si vous en avez besoin.

Il n'y a pas de retour d'une carte, car celle qui est passée à la méthode est remplie.

+0

J'ai découvert que mon objet n'est pas un haricot java ordinaire de haricots mais qu'il a aussi des classes internes. Pouvez-vous me dire comment cela peut être fait? – Shiv

+0

Avec l'introspection de bean, vous pouvez seulement accéder aux méthodes getter et setter d'une classe, mais cela n'a pas d'importance si c'est une classe interne. Si vous voulez lire chaque méthode, vous devrez utiliser la réflexion: http://download.oracle.com/javase/tutorial/reflect/index.html – morja

4

Jetez un oeil à Apache Commons BeanUtils. Il fait déjà une grande partie de ce dont vous avez besoin, et peut même faire le tout en une seule fois.

Questions connexes