2010-08-26 15 views
6

Utilizzando GWT ho una classe Java:Come posso accedere dinamicamente alla proprietà dell'oggetto Java in GWT?

public class Pojo { 
    private String name; 
    public String getName() { return name; } 
    public void setName(String name) { this.name = name; } 
} 

La classe di cui sopra è condiviso tra il codice lato client e server.

Dal codice client, desidero accedere dinamicamente alla proprietà. Cioè, vorrei scrivere un metodo con la seguente firma:

public String getProperty(Object o, String propertyName) 

Tale che il seguente codice dovrebbe funzionare:

Pojo pojo = new Pojo(); 
pojo.setName("Joe"); 
getProperty(pojo, "name"); // this should return "Joe" 

Java riflessione è ovviamente fuori. E ho provato il seguente metodo JSNI:

public static native String getProperty(Object o, String name) /*-{ 
    return o[name]; 
}-*/; 

Ma questo non funziona.

L'special syntax per l'accesso agli oggetti Java da JavaScript non può essere utilizzato come voglio che sia dinamico.

Qualche idea su come posso farlo?

Per completezza, desidero anche essere in grado di impostare una proprietà dinamicamente.

MODIFICA: la risposta di blwy10 era un ottimo consiglio per farmi cercare usando "gwt reflection" invece di termini come "accesso a proprietà dinamiche". Questo mi ha portato a gwt-ent, che ha una soluzione di riflessione molto elegante. Ho intenzione di provare questo, in quanto non richiede un passaggio di generazione del codice separato.

+0

Il codice JS GWT produce viene minimizzato e offuscato di default - quindi c'è una buona probabilità che la vostra proprietà 'name' diventa' xz' in una compilation e 'werq' in un altro - nessun modo per sapere in anticipo. Potresti disattivare l'offuscamento, ma ciò porterebbe a un file JS significativamente più grande. –

+0

attendere. perché la riflessione di Java è fuori? –

+0

@Louis: perché abbiamo a che fare con Google Web Toolkit (GWT) - traduce Java in JavaScript e supporta solo [un sottoinsieme di Java Runtime Library] (http://code.google.com/webtoolkit/doc/latest/ RefJreEmulation.html) –

risposta

2

Questo non risponde direttamente alla tua domanda, ma hai provato questo?

http://gwtreflection.sourceforge.net/

Spero che questo aiuti!

+0

Grazie per il suggerimento. Questo mi ha spianato a googling usando termini diversi, il che mi ha dato questo: http://code.google.com/p/gwt-ent/ Mi piace di più, in quanto non richiede un passaggio di generazione del codice separato. È integrato nel passaggio di compilazione GWT. –

0

È possibile utilizzare GWT AutoBean Framework. Ecco un esempio di 2 minuti-veloce-e-sporco:

public interface Person {  
    public String getName();  
    public void setName(String name);  
} 


public String getPropertyValue(Person p, String propertyName){ 
    return AutoBeanUtils.getAllProperties(AutoBeanUtils.getAutoBean(p)).get(propertyName); 
} 
Problemi correlati