Можно ли с помощью GWT и Guice автоматически создавать экземпляр интерфейса? - PullRequest
0 голосов
/ 15 февраля 2012

Если у меня есть такой интерфейс

public interface MyInterface{
     public ThingA getThingA();
}

, где ThingA равен

public class ThingA{
    public ThingA(){}
}

С помощью GWT и Guice возможно создать экземпляр MyInterface по умолчанию без предоставления конкретной реализации

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Да, это возможно, но не так, как вы можете сделать это на JVM - прокси-классы и другие методы генерации реализации во время выполнения недоступны, но есть метод GWT.create, который будет выглядетьчерез ваши правила повторного связывания (объявленные в файлах модуля, которые вы создаете, и которые должны включать в себя inherits операторы) и предоставьте реализацию.

Самый простой способ использовать эти правила повторного связывания - просто заменить интерфейс или класс на лучшую реализацию - здесь используются теги <replace-with />, и вы можете указать, чем его заменить, и когда вызамени это.Например, когда вы используете Firefox, GWT автоматически заменяет свой базовый код реализации dom на конкретную версию gecko:

<replace-with class="com.google.gwt.user.client.impl.DOMImplMozilla">
  <when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
  <when-property-is name="user.agent" value="gecko1_8"/>
</replace-with>

Это не поможет, но полезно знать.

Второй способ удовлетворить их - объявить класс Generator, чтобы обеспечить реализацию, которую вы хотите.Генераторы расширяют com.google.gwt.core.ext.Generator и (обычно) просматривают переданный им класс, чтобы создать новый тип, и записывают его, возвращая его полностью определенное имя, которое затем используется там, где вы вызвали GWT.create(SomeClass.class).

В вашем случае вы хотели бы взглянуть на методы в интерфейсе MyInterface и сделать что-то вроде вызова конструктора по умолчанию для возвращаемого значения каждого.Таким образом, чтобы получить экземпляр MyInterface через генератор, попросите его вот так и используйте его в качестве интерфейса, описанного:

MyInterface impl = GWT.create(MyInterface.class);
ThingA a = impl.getThingA();

Чтобы объявить ваш генератор и заменить его на MyInterface там, где он его видитиспользуйте такое правило в своем файле модуля (по соглашению, так же, как скомпилируемые классы GWT идут в пакете клиента, генераторы идут в пакете перепривязки):

<generate-with class="my.package.to.rebind.MyInterfaceGenerator">
  <when-type-is class="my.package.to.client.MyInterface" />
</generate-with>

Помимо этого, вы захотитепосмотрите, что делают некоторые другие генераторы, уже находящиеся в базе кода GWT (или написанные вне основной команды GWT).

Исходный ImageBundle (замененный теперь ClientBundle) довольно прост в том, как он фактически создает свой исходный файл с ClassSourceFileComposerFactory и начинает запись в SourceWriter.Большая часть этого может быть найдена в generate и generateImplClass методах com.google.gwt.user.rebind.ui.ImageBundleGenerator.

RPC GWT генерируется com.google.gwt.user.rebind.rpc.ServiceInterfaceProxyGenerator и `` com.google.gwt.user.rebind.rpc.ProxyCreator - это немного сложный в использовании для начала, но он дает некоторые хорошие идеи, включая использование интерфейса маркера для генерации (вместо создания нового правила повторного связывания для каждого нового интерфейса, хотя они делают почти то же самое).

0 голосов
/ 15 февраля 2012

Это невозможно, потому что это потребует создания байт-кода, но в javascript нет байт-кода, и API отражения также недоступен в GWT.

...