Java для JavaScript с использованием компилятора GWT
У меня написан код Java, который я хотел бы преобразовать в JavaScript.
Интересно, возможно ли использовать компилятор GWT для компиляции упомянутого кода Java в код JavaScript , сохраняя все имена методов, переменных и параметров.
Я попытался скомпилировать его с отключенной оптимизацией кода, используя -draftCompile, но имена методов искажены.
Если компилятор GWT не может этого сделать, может ли какой-нибудь другой инструмент?
Обновление
Код Java будет зависеть только от эмулируемых классов GWT, поэтому компилятор GWT сможет его обработать.
Обновление 2
Этот метод Java:
public String method()
переведен на эту функцию JavaScript:
function com_client_T_$method__Lcom_client_T_2Ljava_lang_String_2()
используя параметры компилятора:
-style DETAILED
-optimize 0
-draftCompile
Так что имена не могут быть сохранены. Но есть ли способ контролировать, как они меняются?
Разъяснение
Скажем, например, у вас есть алгоритм сортировки, написанный на Java (или какая-то другая простая математическая утилита). Метод sort() принимает массив целых чисел. и возвращает эти целые числа в отсортированном массиве. Скажем, у меня есть приложения на Java и JavaScript. Я хочу написать этот метод один раз, в Java, запустить его через компилятор GWT и либо оставить имя метода неизменным, либо изменить его предсказуемым образом, чтобы я мог его обнаружить и узнать, как изменить его обратно на сортировку (). Затем я могу поместить этот код в мое приложение JavaScript и использовать его. Я также могу автоматически сгенерировать его, если версия Java изменится. У меня есть очень веские причины для этого, я понимаю концепции GWT на высоком уровне, я просто ищу ответ только на этот счет.
Заключение
Ответ на главный вопрос: НЕТ.
Хотя имя метода может быть несколько сохранено, его тело нельзя использовать. Вызовы метода внутри него разбросаны по всему сгенерированному файлу, и поэтому их нельзя использовать в библиотеке JavaScript, которая была главной темой этой темы.
Ответы
Ответ 1
Хотя вы можете установить компилятор для вывода "симпатичного" кода, я предлагаю вам написать функции экспорта для классов, которые вы хотите вызвать из-за пределов вашего проекта GWT. Я верю, что где-то в документации GWT подробно описано, как это сделать, но я не смог найти его здесь, как только я только что создал.
class YourClass {
public YourClass() {
...
}
public void yourMethod() {
...
}
public static YourClass create() {
return new YourClass();
}
public final static native void export() /*-{
$wnd.YourClass = function() {
this.instance = new @your.package.name.YourClass::create()()
}
var _ = $wnd.YourClass.prototype;
_.yourMethod = function() {[email protected]::yourMethod()()}
}-*/;
}
ИЗМЕНИТЬ
Чтобы разработать, ваш код будет запутан как обычный, но благодаря функции экспорта вы можете легко ссылаться на эти функции извне. Вам не нужно переписывать что-либо из своего Java-класса в JavaScript. Вы только пишете ссылки в JavaScript, так что вы можете сделать это:
var myInstance = new YourClass();
myInstance.yourMethod();
Конечно, вы должны вызвать статический метод экспорта где-нибудь в вашем приложении GWT (скорее всего, в вашем EntryPoint), чтобы сделать эту работу.
Подробнее о ссылках на Java-методы из JavaScript:
http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html#methods-fields
Ответ 2
Нет - это невозможно с компилятором GWT, поскольку компилятор GWT создан для создания оптимизированного и очень совершенного JavaScript из Java.
Большим преимуществом является то, что вы можете поддерживать свой проект в Java и компилировать его с помощью GWT на JavaScript. Поэтому нет необходимости помещать имена переменных и имена методов в результат JavaScript, так как все изменения и работа выполняются в JAVA-источниках.
Работа в JavaScript-выходе GWT просто не так проста и на самом деле очень много работы!
Обновление
По подсказке Дэвида, я нашел вариант компилятора стиль. Вы можете попробовать со следующими параметрами:
-style=PRETTY -optimize=0
Я понятия не имею, действительно ли это приведет к созданию "читаемого человеком" кода. Я думаю, что этого не произойдет, поскольку структура GWT все равно будет частью результирующего JavaScript и поэтому будет трудно внести изменения в результат JavaScript. Попробуйте и сообщите нам...
Ответ 3
Возможно, я могу ответить на ваш второй вопрос: "Если компилятор GWT не может этого сделать, может ли другой инструмент?"
Я использую Java2Script уже довольно давно, а также по довольно крупным проектам. Интеграция с родным JavaScript прекрасна, имена сохраняются, и через какое-то время можно даже скомпилировать сгенерированный JavaScript (в отладчике браузера) с исходным кодом Java с минимальными усилиями.
Удо
Ответ 4
Вы можете "экспортировать" свою функцию, написав встроенный JavaScript, который ее вызывает, и есть инструмент gwt-exporter, который делает это автоматически, когда вы комментируете классы и методы с помощью @Export
и тому подобное. Дополнительная информация: https://code.google.com/p/gwtchismes/wiki/Tutorial_ExportingGwtLibrariesToJavascript_en