2010-08-26 4 views
6

Использование GWT У меня есть класс Java:Как я могу динамически получить доступ к свойству объекта Java в GWT?

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]; 
}-*/; 

Но это не работает.

special syntax для доступа к объектам Java из JavaScript не может использоваться, поскольку я хочу, чтобы это было динамическим.

Любые идеи о том, как я могу это сделать?

Для полноты, я также хочу иметь возможность устанавливать свойство динамически.

EDIT: ответ blwy10 был отличным советом, чтобы найти меня с использованием «gwt reflection» вместо терминов типа «динамический доступ к свойствам». Это привело меня к gwt-ent, который имеет очень элегантное решение для отражения. Я собираюсь попробовать это, так как он не требует отдельного шага генерации кода.

+0

JS код GWT производит это уменьшенная и затемненный по умолчанию - так что есть хороший шанс, что ваш 'name' собственность становится' xz' в одной компиляции и 'werq' в другом - никак не знать заранее. Вы можете отключить обфускацию, но это приведет к значительно большему JS-файлу. –

+0

ждать. почему отражается Java? –

+0

@ Louis: потому что мы имеем дело с Google Web Toolkit (GWT) - он переводит Java на JavaScript и поддерживает только [подмножество Java Runtime Library] (http://code.google.com/webtoolkit/doc/latest/ RefJreEmulation.html) –

ответ

2

Это не отвечает на ваш вопрос напрямую, но вы пробовали это?

http://gwtreflection.sourceforge.net/

Надеется, что это помогает!

+0

Спасибо за подсказку. Это заставило меня искать по-разному с помощью разных терминов, и это меня вызвало: http://code.google.com/p/gwt-ent/ Мне нравится это лучше, так как для этого не требуется отдельный шаг генерации кода. Он интегрирован в этап компиляции GWT. –

0

Вы можете использовать GWT's 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); 
} 
Смежные вопросы