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
Répondre
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?
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.
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
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).
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
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 –
- 1. langage de programmation Java
- 2. Tri d'une liste en langage Java
- 3. Langage de modélisation Java pour C?
- 4. Bibliothèque PNL pour Java langage de programmation
- 5. Langage Java avec toString
- 6. en ce qui concerne le langage de programmation java
- 7. Solution de traitement du langage naturel en Java?
- 8. Analyse du langage de type latex en Java
- 9. Convention de langage Java; getters/setters
- 10. Navigation de produit dans les servlets Java
- 11. Architectures de plugins neutres en langage
- 12. Où est l'Assistant de conversion de langage Java (JLCA) 3.0?
- 13. Comment Java est-il un langage de programmation «impératif» et non un langage «déclaratif»?
- 14. liste d'options de ligne Java de commande de navigation
- 15. les méthodes statiques font de Java un langage pseudo-fonctionnel?
- 16. Barre de navigation en bas
- 17. Contrôleur de navigation en option
- 18. Comment démarrer avec le langage de programmation Ruby avec Java?
- 19. Conversion sortie langage Java à la sortie de langue Joomla
- 20. langage de requête Mise en veille prolongée
- 21. Client de datastore Cassandra en langage Go
- 22. Littéraux en langage de modèle django?
- 23. Modèles de conception en langage assembleur
- 24. Génération d'API Agnostic de langage
- 25. Équivalent en langage d'expression
- 26. Javascript en langage machine
- 27. Mise en page du répertoire source de langage mixte
- 28. Quel langage de script ingame devrais-je prendre en charge?
- 29. Commutateur de langage PHP?
- 30. Analyseur de langage DOT
avez-vous trouvé une bonne solution pour cela? – Andez