Salut,

Envoyé par
rolintoucour
Ma question visait plus précisément à comprendre ce que GWT fait à partir de l'interface que l'on annote : est-elle convertie tout d'abord en Java, si oui comment (avant le JS), ou est-elle directement convertie en Javascript ?
C'est le "Deffered Binding".
Il s'applique pour tous les types que tu instancies par GWT.create().
Tu as deux type de Deffered Binding :
1. Le Deffered Binding par remplacement
Grosso-modo cela consiste à remplacer un type par un autre.
Par exemple lorsque le compilateur GWT trouve ceci :
MonType instance = GWT.create(MonType.class);
Il va chercher comment générer le type "MonType", à partir des infos contenu dans les fichiers .gwt.xml.
On peut donc y définir une classe concrête de remplacement, par exemple :
1 2 3
| <replace-with class="com.company.client.anywhere.MonTypeImpl">
<when-type-is class="com.company.client.MonType" />
</replace-with> |
Ici GWT remplacera MonType par MonTypeImpl, ce qui donnera l'équivalence suivante :
1 2
| //MonType instance = GWT.create(MonType.class);
MonType instance = new com.company.anywhere.MonTypeImpl(); |
Bien sûr la classe MonTypeImpl existe déjà...
L'intérêt c'est qu'on a la possibilité de modifier le type selon des propriétés comme par exemple l'user.agent ou la locale :
[code=XML]<replace-with class="com.company.client.anywhere.MonTypeImpl">
<when-type-is class="com.company.client.MonType" />
</replace-with>
<replace-with class="com.company.client.anywhere.MonTypeImplIE6">
<when-type-is class="com.company.client.MonType" />
<when-property-is name="user.agent" value="ie6" />
</replace-with>
Désormais, MonType sera toujours remplacé par MonTypeImpl, sauf pour la permutation d'IE6 où on utilisera MonTypeImplIE6 à la place...
2. Le Deffered Binding par génération
Le remplacement est suffisant pour les cas les plus simple, mais ce n'est pas suffisant pour des choses plus complexe. On peut alors utilisé des generateurs.
1 2 3
| <generate-with class="com.company.rebind.MonTypeGenerator">
<when-type-assignable class="com.company.client.MonType" />
</generate-with> |
Désormais, lorsque le compilateur touvera un GWT.create(MonType.class), il va utiliser la classe MonTypeGenerator pour générer le code correspondant.
Cette classe étend com.google.gwt.core.ext.Generator et possède une méthode generate() qui sera appelée avec le nom du type et surtout un GeneratorContext qui permet d'accéder aux infos du code source (nom des méthodes, annotations, etc), tout en permettant en même temps de générer une classe Java.
Cette classe sera elle-même compilé en javascript par la suite...
Plus d'info ici : https://developers.google.com/web-to...BasicsDeferred
a++
Partager