Да, это возможно, но не так, как вы можете сделать это на 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 - это немного сложный в использовании для начала, но он дает некоторые хорошие идеи, включая использование интерфейса маркера для генерации (вместо создания нового правила повторного связывания для каждого нового интерфейса, хотя они делают почти то же самое).