2010-08-26 46 views
6

使用GWT我有一個Java類:如何動態訪問GWT中Java對象的屬性?

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

上述類的客戶端和服務器端代碼之間共享。

從客戶端代碼我想動態訪問屬性。也就是說,我想編寫一個方法具有以下簽名:

public String getProperty(Object o, String propertyName) 

使得下面的代碼將工作:

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

Java反射是明顯的。並且我嘗試了以下JSNI方法:

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

但是這並不起作用。

用於從JavaScript訪問Java對象的special syntax無法使用,因爲我希望這是動態的。

關於如何做到這一點的任何想法?

爲了完整性,我也希望能夠動態地設置屬性。

編輯:blwy10的回答是一個偉大的提示讓我搜索使用「gwt反射」而不是像「動態屬性訪問」的條款。這導致我gwt-ent,它有一個非常優雅的反射解決方案。我將嘗試這一個,因爲它不需要單獨的代碼生成步驟。

+0

JS代碼GWT產生的微細化以及默認模糊 - 所以有你'name'屬性在一個編譯成爲'xz'一個很好的機會,在另一個「werq」 - 沒有辦法事先知道。你可以關閉混淆,但是這會導致一個更大的JS文件。 – 2010-08-26 02:45:31

+0

等待。爲什麼Java反射出來? – 2010-08-26 02:48:30

+0

@Louis:因爲我們在此處理Google Web Toolkit(GWT) - 它將Java轉換爲JavaScript,並且僅支持[Java運行時庫的一個子集](http://code.google.com/webtoolkit/doc/latest/ RefJreEmulation.html) – 2010-08-26 12:08:17

回答

2

這並不直接回答你的問題,但你有沒有嘗試過?

http://gwtreflection.sourceforge.net/

希望這會有所幫助!

+0

感謝您的提示。這使我使用不同的術語搜索,這讓我這個:http://code.google.com/p/gwt-ent/ 我更喜歡這個,因爲它不需要單獨的代碼生成步驟。它被集成到GWT編譯步驟中。 – 2010-08-26 05:51:23

0

您可以使用GWT的AutoBean Framework。這裏有一個2分鐘,快速和骯髒的例子:

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); 
}