динамический прокси в gwt - PullRequest
2 голосов
/ 08 июня 2011

Можно ли создать динамический прокси в gwt? Я хочу создать библиотеку который меняет поведение методов некоторого класса (интерфейс будет параметр), например, когда пользователь вызывает метод реализации класса интерфейс, он всегда будет возвращать строку "abc". В яве это было бы как то так:

public class proxyHandler implements InvocationHandler { 
    private Object proxied; 
    public proxyHandler(Object proxied) { 
            this.proxied = proxied; 
    } 
    public Object invoke(Object proxy, Method method, Object[] args) 
                    throws Throwable { 
            return "abc"; 
    } 
}
public static void main(String[] args) {
    Object object = new Object();
    Interface proxy = (Interface) Proxy.newProxyInstance(
            Interface.class.getClassLoader(),
            new Class[] { Interface.class }, new proxyHandler(object));
    System.out.println(proxy.getName());
}

Можно сделать что-то подобное в gwt (используя deferred обязательный, что угодно)? Спасибо за любую помощь


Но я не хочу создавать код для MyClassOne или MyClassTwo. Я хочу создать динамический прокси - создать один класс (как proxyHandler в примере Java), который обслуживает любой тип объекта. Я хочу, чтобы пользователь дал мне интерфейс / класс, и я возвращаю ему объект (например, интерфейсный прокси выше), который он может использовать как обычный класс, но это сделало бы что-то большее.


Отражение GWT не обновляется с 2007 года. Я также рассмотрел gwittir и gwt-ent, но не могу найти никакой информации о том, как в них динамические прокси

Ответы [ 3 ]

4 голосов
/ 08 июня 2011

Да, GWT предоставляет способ «подключить» собственную реализацию классов и интерфейсов.Это делается с помощью генераторов.

Пример:

public class MyGenerator extends Generator{

    public String generate(TreeLogger logger, GeneratorContext context, 
                           java.lang.String typeName)
                           throws UnableToCompleteException {

        if (someCondition) {
            return "com.mypackage.MyClassOne"
        } else {
            return "com.mypackage.MyClassTwo"
        }
    }
}

, затем используйте его в своем файле .gwt.xml:

<generate-with class="com.mypackage.MyGenerator">  
    <when-type-assignable class="com.otherpackage.SomeClass" />  
</generate-with> 

Так что, когда SomeClassнеобходимо, генератор подключит MyClassOne или MyClassTwo в зависимости от некоторых условий.

Если вам просто нужно заменить один класс / интерфейс вашей реализацией, вам не нужно использовать генератор, просто используйте<replace-with> в объявлении модуля gwt:

<replace-with class="com.mypackage.MyClass">               
    <when-type-is class="com.otherpackage.SomeClass"/>
</replace-with>

Посмотрите этот блог для получения дополнительной информации о генераторах:

http://blog.jdevelop.eu/2010/01/17/use-generators-to-create-boilerplate-code-in-gwt-20/

http://blog.jdevelop.eu/2010/01/17/use-generators-to-create-boilerplate-code-in-gwt-20/

2 голосов
/ 08 июня 2011

AFAIK вы не можете: у вас нет размышлений о GWT. Существует GWT-отражение , но я никогда не использовал его.

0 голосов
/ 29 марта 2012

Вы можете использовать для этого GWT AutoBeans . Все не получающие / устанавливающие методы обрабатываются категориями, которые могут иметь метод Перехватчики :

Реализация категории может дополнительно объявить метод-перехватчик для проверки и, возможно, замены возвращаемых значений всех не пустых методов в целевом интерфейсе:

public static <T> T __intercept(AutoBean<?> bean, T returnValue) {
  // Do stuff
  return maybeAlteredReturnValue;
}
...