2010-03-08 7 views
9

Nel sistema che sto attualmente sviluppando, devo spesso navigare in un albero degli oggetti e in base al suo stato e ai suoi valori intraprendere azioni. In Java normale questo risulta noioso per cicli, se le istruzioni ecc ... Esistono modi alternativi per ottenere la navigazione dell'albero, simile a XPath per XML? So che esistono JXPath e OGNL, ma conosci altre librerie per questo scopo? Conoscete eventuali librerie che generano bytecode per specifiche espressioni di navigazione dell'albero per rendere l'elaborazione veloce come Java fors nativi e se?Lingua di navigazione dell'albero degli oggetti in Java

+0

hai trovato una soluzione per questo? – Andez

risposta

2

Posso chiederti perché non ti piacerebbe OGNL/JXPath? Ovviamente potresti aver fatto la tua ricerca per dire di no ma mi piacerebbe sapere perché OGNL non sta risolvendo uno scopo che è stato progettato per risolvere.

Anche le raccolte di google hanno alcuni funtori (oltre alle raccolte di servizi comuni menzionate sopra) che potrebbero valere la pena guardare.

+2

OGNL e JXPath utilizzano la riflessione per interpretare le espressioni di navigazione del grafico o dell'albero. In alcune situazioni questo è ok, ma per il mio caso d'uso ho bisogno di una libreria che generi bytecode per le espressioni ad albero per renderli veloci come il normale codice java. – paweloque

5

Si può prendere in considerazione Jakarta Bean Utils

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

È possibile navigare attraverso il grafico oggetto utilizzando una notazione punto. È possibile accedere anche a proprietà indicizzate. Maggiori dettagli sui documenti.

Uno svantaggio è che Bean Utils si aspetta che il grafico che si sta navigando non contenga riferimenti null.

Il frammento di codice di seguito avrebbe gettato un NPE

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

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

Per superare questo limite la mia squadra ha implementato una classe che crea le istanze di tutti i riferimenti nulli di un grafico su richiesta. Questo codice è basato sulla riflessione e sui proxy dinamici (CGLIB).

+0

Questo è vero, ma usando i beanutils non è possibile definire predicati sui nodi o eseguire funzioni sui valori. – paweloque

+0

Capisco, non ho catturato quel requisito. In tal caso, il suggerimento di David (Raccolte comuni) può essere utile. Ha un'API dei predicati (http://www.discursive.com/books/cjcook/reference/collections-sect-filtering.html), ma potrebbe essere più dettagliato di quanto ci si aspetterebbe. Puoi anche prendere in considerazione Google Collections (http://code.google.com/p/google-collections/). Ho sentito dire che implementano anche il filtraggio per predicati –

Problemi correlati