Google Web Toolkit 小组就 GWT overlay 类型发表了一篇文章,将其作为正在进行的名为“Getting to really know GWT(真正了解 GWT)”系列文章的一部分。
GWT 1.5 引入了JavaScript overlay 类型以简化将整个 JavaScript 对象家族集成到 GWT 项目的过程。该技术有很多优势,如利用 Java IDE 的代码完成和重构能力,甚至当你在编写无类型的 JavaScript 对象时也可以充分利用这一优势。
这篇文章展示了如何为 JSON 数据创建 Java bean 风格的包装器:
<pre id="apur">var jsonData = [<br id="utax"></br> { "FirstName" : "Jimmy", "LastName" : "Webber" },<br id="utax0"></br> { "FirstName" : "Alan", "LastName" : "Dayal" },<br id="utax1"></br> { "FirstName" : "Keanu", "LastName" : "Spoon" },<br id="utax2"></br> { "FirstName" : "Emily", "LastName" : "Rudnick" }<br id="utax3"></br>];<br id="utax4"></br>
相应的 GWT Java 对象可以将 JSNI 方法调用与常规的 Java 方法结合起来,使用内置功能来产生类型安全的 Java 对象:
<pre id="aj3q1">class Customer extends JavaScriptObject {<p> // Overlay types always have protected, zero-arg ctors</p><br id="aj3q4"></br> protected Customer() { } <p> // Typically, methods on overlay types are JSNI</p><br id="aj3q7"></br> public final native String getFirstName() /*-{ return this.FirstName; }-*/;<br id="aj3q8"></br> public final native String getLastName() /*-{ return this.LastName; }-*/;<p> // Note, though, that methods aren't required to be JSNI</p><br id="aj3q11"></br> public final String getFullName() {<br id="aj3q12"></br> return getFirstName() + " " + getLastName(); <br id="aj3q13"></br> }<br id="aj3q14"></br>}<p>class JsArray<E extends JavaScriptObject> extends JavaScriptObject {</p><br id="nzdn1"></br> protected JsArray() { }<br id="nzdn2"></br> public final native int length() /*-{ return this.length; }-*/;<br id="nzdn3"></br> public final native E get(int i) /*-{ return this[i]; }-*/;<br id="nzdn4"></br>}
剩下的步骤就是将 Javascript 对象转化为 Java 对象,这是通过变量推断(variable inference)和另一个 JSNI 调用完成的:
<pre id="zsou0">private final native JsArray<Customer> getCustomers() /*-{<br id="zsou1"></br> return $wnd.jsonData;<br id="zsou2"></br>}-*/;
请查看原始文章以进一步了解overlay 功能以及GWT 编译器对其所做的优化。
评论