Можете ли вы использовать Java Reflection API в клиенте GWT - PullRequest
23 голосов
/ 16 ноября 2010

Возможно ли использовать Java-API отражения на стороне клиента GWT?Я хочу использовать отражения, чтобы найти значение свойства в Javabean.Возможно ли это?

Ответы [ 6 ]

12 голосов
/ 31 января 2011

Я был там, и решение действительно заключается в использовании отложенного связывания и генераторов. Вы можете увидеть использование Генераторов для преодоления отсутствия отражения в клиенте GWT здесь:

http://jpereira.eu/2011/01/30/wheres-my-java-reflection/

Надеюсь, это поможет.

12 голосов
/ 16 ноября 2010

Вы можете использовать функциональность GWT Generators, которая позволяет генерировать код на этапе компиляции GWT.

Ваш боб, который вы хотите проанализировать, может расширять класс, у которого есть метод, определенный как

public Object getProperty(String propertyName){}

Давайте назовем этот класс IntrospectionBean.

Предположим, что ваш бин определен как:

public class MyBean extends IntrospectionBean {
    private String prop1;
    private String prop2;
}

Генератор GWT будет иметь доступ ко всем полям MyBean и может генерировать метод getProperty(String propertyName) во время компиляции GWT после итерации всех полей MyBean.

Сгенерированный класс может выглядеть так:

public class MyBean extends IntrospectionBean {
    private String prop1;
    private String prop2;

    public Object getProperty(String propertyName) {
        if ("propr1".equals(propertyName)) {
            return prop1;
        }
        if ("propr2".equals(propertyName)) {
            return prop2;
        }

        return null;
    }
}

Вы можете просто использовать myBean.getProperty("prop1"), чтобы получить свойство на основе его имени во время выполнения.

Здесь вы можете найти пример реализации генератора gwt

10 голосов
/ 16 ноября 2010

Поскольку код GWT переведен на Javascript, прямое использование API отражения не поддерживается.

Существует небольшой проект GWT-Reflection , который позволяет использовать отражение в GWT.

2 голосов
/ 19 августа 2018

GWT не поддерживает отражение полностью, вы можете увидеть ниже ссылку:

http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsCompatibility.html

Вы должны отметить границу между java и javascript.В GWT весь код компилируется в javascript, поэтому вы должны проверить, является ли JavaScript четким отражением.

2 голосов
/ 29 октября 2013

Я сделал мою библиотеку gwt-отражением публичной.

https://github.com/WeTheInternet/xapi/tree/master/gwt/gwt-reflect https://github.com/WeTheInternet/gwt-sandbox/tree/xapi-gwt/user/src/com/google/gwt/reflect

Из-за проблем с classpath при попытке заставить Gwt выбрать мою версиюВ дополнение к классу .java, я, наконец, просто раздвоил Gwt, добавил java 8 и поддержку отражений, и теперь поддерживаю net.wetheinter: gwt - *: 2.7.0, в который включена эта поддержка (я выпустлю 2.8 через некоторое время после Gwt2.8 выходит в эфир)

Поддерживает три уровня отражения:

Монолитный:

// Embeds all data needed to perform reflection into hidden fields of class
GwtReflect.magicClass(SomeClass.class);
SomeClass.getField(fieldName).set(null, 1);

Легкий вес:

// Allows direct reflection, provided ALL parameters are literals, or traced to literals
SomeClass.class.getField("FIELD_NAME").set(null, 1);

Вес в полете:

// Skips creating a Field object entirely, and just invokes the accessor you want
// All params must be literals here as well
GwtReflect.set(SomeClass.class, "FIELD_NAME", null, 1);

Эти примеры также работают для методов и конструкторов.Есть базовая поддержка для аннотаций и многое другое в будущем.

0 голосов
/ 12 января 2013

Если вы просто хотите использовать отражение для захвата приватного поля, рассмотрите возможность использования jsni (собственный интерфейс javascript); у него нет понятия приватного или публичного, поэтому вы можете просто взять что-нибудь, например:

package com.foo;

class SomeClass {
    private String someField;
    private static int someInt;
}

//accessors:
native String ripField(SomeClass from)
/*-{
  return from.@com.foo.SomeClass::someField;
}-*/;
native int ripInt()
/*-{
  return @com.foo.SomeClass::someInt;
}-*/;

Кроме того, я нахожусь в процессе завершения эмуляции для java.lang.Class newInstance / отражения.

Я вернусь сюда со ссылкой через два дня, если вы захотите поиграть с ней.

Требуется, чтобы вы передавали класс через метод, который я перенаправляю в пользовательский генератор. (как GWT.create, за исключением того, что он возвращает сгенерированный java.lang.Class с полями и методами доступа к методам, которые просто указывают на методы / поля jsni.

...