2012-02-15 59 views

回答

2

是的,這是可能的,但不是以正常的方式在JVM上執行 - 在運行時生成實現的代理類和其他方法不可用,但有GWT.create方法,它將通過您的重新綁定規則(在您創建的模塊文件中聲明,並且包含inherits條語句)並提供實現。

使用這些重新綁定規則的最簡單方法是用一些更好的實現來代替接口或類 - 它使用<replace-with />標籤,您可以指定要替換它的內容以及何時替換它。例如,當您使用的是Firefox,GWT將自動替換其底層DOM實現代碼與壁虎特定版本:

<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。大部分可在com.google.gwt.user.rebind.ui.ImageBundleGeneratorgenerategenerateImplClass方法中找到。

GWT的RPC由com.google.gwt.user.rebind.rpc.ServiceInterfaceProxyGenerator和``com.google.gwt.user.rebind.rpc產生。ProxyCreator - 使用起來有點複雜,但確實提供了一些很好的見解,包括使用標記接口來生成(而不是爲每個新界面制定新的重新綁定規則,儘管它們幾乎完成相同的事情)。

0

這不可能是可能的,因爲這將需要字節碼的創作,但在JavaScript中沒有字節碼和反射API是不是在GWT提供兩種。

+0

不知道爲什麼倒票:)因爲這是不可能的*沒有創建具體的實現*。有權訪問'GWT.create'並使用生成器創建實現是同樣的事情。您只是通過從字符串創建Java代碼來提供*具體實現*,因此它是在編譯時完成的。在運行時沒有辦法做到這一點。 – Strelok 2012-02-15 22:57:20

+0

是的,你在技術上是正確的 - 雖然這項工作是在編譯時完成的,並且結果不是(通常)可用於GWT以外的代碼。答案是有效的,甚至有幫助,設置GWT的期望,所以我不知道爲什麼人們會投票它... – 2012-02-16 02:31:18

相關問題