GWT компилирует ваше приложение, а не просто конвертирует его. Он действительно использует объект prototype
в JavaScript для создания классов по мере необходимости, как правило, в соответствии с вашей иерархией классов (и любыми используемыми вами классами GWT), но вносит много других изменений:
Оптимизация:
- Усиливает типы - если вы ссылаетесь на что-то как
List
, но это может быть только ArrayList
, оно переписывает объявления типов. Это само по себе мало что дает, но позволяет другим шагам работать лучше, например
- Создание методов статическими - например, если ничто не отменяет ArrayList.add, это превратит любые вызовы, которые он может доказать, в ArrayList.add, в статический вызов, предотвращая необходимость динамической отправки и допуская строку 'this' в последнем JS будет заменено более коротким именем arg. Это предотвратит наличие у объекта JS метода, который вы ожидаете.
- Встроенные методы - если метод достаточно прост и вызывается в нескольких местах, компилятор может полностью удалить метод, поскольку он знает все места, где он вызывается. Это напрямую повлияет на ваш вариант использования.
- Удаляет / встраивает несвязанные поля - если вы читаете в поле, но пишете его только один раз, он будет считать, что исходное значение является константой. Если вы не читаете его, нет причин назначать его. Значения, которые компилятор не может сказать, когда-либо будут использоваться, не должны занимать место в js и время в браузере. Это также напрямую повлияет на трактовку gwt'd Java как JS.
После этого, помимо прочего, компилятор будет переименовывать поля, аргументы и типы, чтобы быть как можно меньшим - редко, когда поле или аргумент будут длиннее 1 символа, когда они завершены, поскольку они наиболее часто используются и имеют наименьшая область действия, поэтому компилятор может использовать ее чаще всего. Это также повлияет на попытки обработать объекты как JSON.
Библиотеки, которые позволяют экспортировать объекты GWT в формате JSON, делают это, делая некоторые другие предположения.
- JavaScriptObject (JSO) не является реальным объектом Java, но на самом деле представляет собой экземпляр JavaScript, так что вы можете приводить туда-сюда по своему усмотрению - написанный вами JSNI будет относительно неоптимизированным, так как компилятор не может определить, пытаются общаться с внешней библиотекой.
- AutoBeans создаются для того, чтобы предполагать, что они должны иметь возможность записывать JSON, поэтому в них записываются определенные методы кодирования объектов. Они будут подчиняться тем же правилам, что и другая компилируемая Java - код, который не является используемый может быть удален, код, который вызывается только одним способом, может быть сжат или встроен.
- Библиотеки, которые могут экспортировать JS-компиляцию в деталях Java в конечный исполняемый файл, увеличивая его, но предоставляя вам возможность обрабатывать эти объекты Java как JS некоторым ограниченным образом.
И последнее замечание, поскольку вы говорите как о JSON, так и о Javascript. Некоторые обычные JS не подходят для записи в формате JSON. У объектов Date нет последовательного способа сериализации, который распознается JSON. Графы объектов не из дерева не могут быть сериализованы:
var obj = {};
obj.prop = {};
obj.prop.obj = obj;
Autobeans поставляется со встроенным средством проверки для этих циклических ссылок, и я надеюсь, что сериализация JSO делает то же самое.