GWT编译你的应用程序,它不只是转换。它利用prototype
对象的JavaScript来构建类,因为它需要,通常是按照你的类层次结构(和你使用任何GWT类),但它使许多其他变化:
优化:
- 收紧类型的 - 如果你指的东西作为
List
,但它只能是一个ArrayList
,重写类型声明。这本身犯规给多少,但它可以让其他步骤做的更好的工作,如
- 制作方法静态 - 如果什么事也没覆盖ArrayList.add,例如,这将打开它可以证明任何电话都ArrayList.add成一个静态调用,防止动态调度的需要,并允许在最后JS的“这个”字符串是用更短的ARG替换名称。这会阻止JS对象拥有你期望的方法。内联方法 - 如果一个方法足够简单,并且在足够少的地方调用,编译器可能完全移除该方法,因为它知道调用它的所有地方。这将直接影响你的用例。
- 中移除了/内联未引用的领域 - 如果你阅读到现场,但只写一次,它会假定原来的值是一个常数。如果你没有阅读它,没有理由分配它。编译器无法分辨的值将永远不会被使用在js中的空间和浏览器中的时间。这也将直接影响将gwt'd Java作为JS处理。
在这些之后,编译器会重新命名字段,参数和类型,使其尽可能小 - 当字段或参数完成时很少会超过1个字符,因为这些是最常见的使用并且具有最小范围,因此可以被编译器最经常地重用。这也会影响尝试将对象视为JSON。
允许您将GWT对象导出为JSON的库通过做出其他假设来做到这一点。
- JavaScriptObject(JSO)是不是一个真正的Java对象,但实际上代表了JavaScript的情况下,这样你就可以随意施展来回 - 你写的JSNI将出现相对未优化,因为编译器不能告诉你是否试图与外部图书馆交谈。
- 生成的AutoBeans假定它们应该能够写出JSON,因此编写对象的特定方法被写入。它们将遵循与编译的其他Java相同的规则 - 未使用的代码可能会被删除,仅被称为一种方式的代码可能会被收紧或内联。
- 可以导出JS的库以Java的细节编译到最终的可执行文件中,使其更大,但让您能够以某种有限的方式处理JS这些Java对象。
最后一点,既然你讲的都是关于JSON和Javascript - 一些普通的JS并不适合写成JSON。日期对象没有一致的方式来序列化,可以被JSON识别。非树对象图无法序列:
var obj = {};
obj.prop = {};
obj.prop.obj = obj;
Autobeans配备了一个内置的检查,这些循环引用,我会希望JSO序列化操作为好。
非常感谢。现在完美。 – paul 2012-02-22 10:25:55