2010-10-24 3 views
1

J'ai créé la valeur par défaut « Bonjour tout le monde » application GWT et a remarqué qu'il a le code par défaut suivant:Comment GWT instancier une classe d'interface Java

/** 
* Create a remote service proxy to talk to the server-side Greeting service. 
*/ 
private final GreetingServiceAsync greetingService = GWT.create(GreetingService.class); 

Je me demandais comment cela est possible depuis la déclaration de GreetingService est:

@RemoteServiceRelativePath("greet") 
public interface GreetingService extends RemoteService { 
    String greetServer(String name) throws IllegalArgumentException; 

} 

Je pensais que vous n'étiez pas capable d'instancier des Interfaces?

Merci!

+0

double possible de [instancier interface JAVA?] (Http: // stackoverflow.com/questions/3829642/instantiate-interface-en-java) – Bozho

+2

Le lien @Kirk Bozho est sur ** GWT ** – Cristian

Répondre

3

Eh bien, d'une part, il n'appelle pas un constructeur sur une interface. Ceci est parfaitement valide Java, et dans de nombreux cadres de Service Locator ce serait bien. Il appelle simplement une méthode, qui renvoie quelque chose implémentant GreetingServiceAsync autant que le compilateur Java est conscient. La prochaine chose à retenir est que ce ne sera pas en cours d'exécution en Java quand même. GWT va traduire tout le code client en JavaScript par magie. Tout ce qu'il faut savoir, c'est ce que le chemin distant est (ainsi il peut savoir où faire les appels de service pertinents) et quelles sont les signatures (donc le Java a quelque chose à travailler, et donc il peut valider que vous passez correctement arguments au service distant). Au moment de l'exécution, cela ne va pas créer un Java objet du tout ... il va faire quelque chose en JavaScript pour qu'il puisse faire le RPC ... et ensuite du côté serveur, vous pouvez avoir une implémentation réelle de l'interface écoutant cette requête.

+0

Comment détermine-t-il la mise en œuvre pertinente? Je pensais que l'appel "Create" essaierait d'instancier n'importe quelle classe que tu passerais? – Hortitude

+0

@Hortitude: Voir ma réponse réécrite. –

+0

Cela est vrai lorsque l'application s'exécute sous forme compilée (JavaScript). Mais puisque GWT fournit également un mode de développement (qui s'exécute en Java), il doit être capable de créer un objet Java. À cette fin, la liaison différée et les générateurs de code Java sont utilisés. Vous pouvez voir ces classes générées, lorsque vous activez l'option du compilateur '-gen'. –

2

Il utilise deferred binding, et dans ce cas avec un générateur pour créer dynamiquement l'implémentation de l'interface lors de la compilation (ou de l'exécution dans le cas de DevMode, mais en fait il génère du code Java compilé à la volée)

1

le RPC Plumbing Diagram mentionne:

Certaines de ces classes, comme le proxy de service , sont générés automatiquement dans les coulisses et vous en général ne réaliseront jamais leur existence.

Jetons un coup d'oeil derrière les coulisses:

Nous allons commencer à /com/google/gwt/rpc/RPC.gwt.xml dans GWT-user.jar:

<generate-with class="com.google.gwt.rpc.rebind.RpcServiceGenerator"> 
    ... 
    <when-type-assignable class="com.google.gwt.user.client.rpc.RemoteService" /> 
    ... 
</generate-with> 

Cela spécifie un deferred binding, comme mentionné par Thomas Broyer. Donc, nous allons aller à RpcServiceGenerator:

... 
return new RpcProxyCreator(remoteService); 
... 

Maintenant, vous pouvez jeter un regard détaillé sur le code relativement complexe de RpcProxyCreator et sa superclasse ProxyCreator. Je crois, le morceau de code que vous cherchez est en ProxyCreator.getSourceWriter:

... 
composerFactory.addImplementedInterface(
    serviceAsync.getErasedType().getQualifiedSourceName()); 
... 
Questions connexes