2010-03-08 14 views
9

In dem System, das ich gerade entwickle, muss ich oft durch einen Objektbaum navigieren und basierend auf seinem Zustand und seinen Werten Aktionen ausführen. Im normalen Java führt dies zu langwierigen for-Schleifen, if-Anweisungen etc ... Gibt es alternative Möglichkeiten, um eine Baumnavigation zu erreichen, ähnlich wie XPath für XML? Ich weiß, dass es JXPath und OGNL gibt, aber kennen Sie andere Bibliotheken für diesen Zweck? Kennen Sie Bibliotheken, die Bytecodes für bestimmte Baumnavigationsausdrücke generieren, um die Verarbeitung so schnell wie Java native fors und ifs zu machen?Objektbaum-Navigationssprache in Java

+0

Haben Sie eine gute Lösung dafür gefunden? – Andez

Antwort

2

Kann ich Sie fragen, warum Sie OGNL/JXPath nicht möchten? Offensichtlich hast du deine Nachforschungen gemacht, um nein zu sagen, aber ich würde gerne wissen, warum OGNL nicht einen Zweck löst, den es lösen soll.

Auch google-collections hat einige Funktoren (zusätzlich zu den oben genannten Commons-Sammlungen), die sich sehen lassen können.

+2

OGNL und JXPath verwenden Reflektion, um die Navigationsausdrücke für Diagramme oder Bäume zu interpretieren. In einigen Situationen ist das in Ordnung, aber für meinen Anwendungsfall brauche ich eine Bibliothek, die Bytecodes für die Baumausdrücke erzeugt, um sie so schnell wie normalen Java-Code zu machen. – paweloque

5

Sie können Jakarta Bean Utils

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

Sie können navigieren Sie durch die Objektgraphen betrachten wollen eine Punktnotation verwendet. Sie können auch auf indexierte Eigenschaften zugreifen. Weitere Details zu den Dokumenten

Ein Nachteil ist, dass Bean Utils erwartet, dass das Diagramm, das Sie navigieren, keine Nullreferenzen enthält.

unten würde das Codefragment eine NPE werfen

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

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

diese Einschränkung zu überwinden mein Team eine Klasse implementiert, die Instanzen aller null Referenzen eines Graphen auf Nachfrage schafft. Dieser Code basiert auf Reflektion und dynamischen Proxies (CGLIB).

+0

Das stimmt, aber mit den Beanutils ist es nicht möglich, Prädikate auf Knoten zu definieren oder Funktionen auf Werten auszuführen. – paweloque

+0

Ich verstehe, ich habe diese Anforderung nicht erfasst. In diesem Fall kann Davids Vorschlag (Gemeinsame Sammlungen) nützlich sein. Es hat eine Prädikaten-API (http://www.discursive.com/books/cjcook/reference/collections-sect-filtering.html), aber es kann ausführlicher sein, als Sie erwarten würden. Sie können auch Google Sammlungen (http://code.google.com/p/google-collections/) in Betracht ziehen. Ich habe gehört, dass sie auch die Filterung durch Prädikate implementieren –