2010-03-08 3 views
9

Dans le système que je suis en train de développer, je dois souvent naviguer dans un arbre d'objets et, en fonction de son état, prendre des mesures. En Java normal cela se traduit par des boucles fastidieuses, si des déclarations etc ... Existe-t-il d'autres moyens de réaliser une navigation arborescente, similaire à XPath pour XML? Je sais qu'il y a JXPath et OGNL, mais connaissez-vous d'autres bibliothèques à cette fin? Connaissez-vous des bibliothèques qui génèrent des bytecodes pour des expressions de navigation arborescentes spécifiques afin de rendre le traitement aussi rapide que les fors natifs Java et les ifs?Langage de navigation de l'arborescence d'objets en Java

+0

avez-vous trouvé une bonne solution pour cela? – Andez

Répondre

1

Les collections de Jakarta (http://commons.apache.org/collections/apidocs/) vous permettent d'appliquer des prédicats, des foncteurs, etc ... sur les membres de la collection. Est-ce la direction que vous recherchez? Puis-je vous demander pourquoi vous n'aimez pas OGNL/JXPath?

2

De toute évidence, vous avez peut-être fait vos recherches pour dire non, mais j'aimerais savoir pourquoi OGNL ne répond pas à un objectif pour lequel elle a été conçue.

Aussi google-collections a quelques foncteurs (en plus des collections communes mentionnées ci-dessus) qui peuvent être dignes d'intérêt.

+2

OGNL et JXPath utilisent la réflexion pour interpréter le graphique ou les expressions de navigation arborescente. Dans certaines situations, cela est correct, mais pour mon cas d'utilisation, j'ai besoin d'une bibliothèque qui génère des bytecodes pour que les expressions arborescentes soient aussi rapides que le code java normal. – paweloque

5

Vous pouvez envisager Jakarta Bean Utils

String street = (String) PropertyUtils.getProperty(user, "address.street"); 

Vous pouvez naviguer à travers le graphe d'objet en utilisant une notation de points. Vous pouvez également accéder aux propriétés indexées. Plus de détails sur les docs. Un inconvénient est que Bean Utils s'attend à ce que le graphique que vous naviguez ne contienne pas de références nulles.

L'extrait de code ci-dessous jetterait un NPE

Person person = new Person(); 
person.setAddress(null); 

String street = (String) PropertyUtils.getProperty(person, "address.street"); 

Pour surmonter cette limitation mon équipe a mis en œuvre une classe qui crée des instances de toutes les références nulles d'un graphique sur demande. Ce code est basé sur la réflexion et les proxies dynamiques (CGLIB).

+0

Cela est vrai, mais en utilisant les beanutils, il n'est pas possible de définir des prédicats sur des nœuds ou d'exécuter des fonctions sur des valeurs. – paweloque

+0

Je comprends, je n'ai pas saisi cette exigence. Dans ce cas, la suggestion de David (collections communes) peut être utile. Il possède une API de prédicats (http://www.discursive.com/books/cjcook/reference/collections-sect-filtering.html), mais elle peut être plus verbeuse que vous ne le pensez. Vous pouvez également envisager Google Collections (http://code.google.com/p/google-collections/). J'ai entendu qu'ils implémentent également le filtrage par prédicats –

Questions connexes