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编写的排序算法(或其他一些简单的Maths实用程序)。 方法sort()接受一个整数数组。 并在排序的数组中返回这些整数。 现在说,我有Java和JavaScript应用程序。 我想用Java编写这个方法一次,通过GWT编译器运行它,并保持方法名称相同,或者以可预测的方式更改它,这样我就可以检测它并知道如何将其更改回sort( )。 然后我可以将该代码放在我的JavaScript应用程序中并使用它。 如果Java版本发生变化,我也可以自动重新生成它。 我在技术上有一个非常好的理由,我在高层次上理解GWT的概念,我只是在寻找这一点的答案。

结论

主要问题的答案是否定的 。 虽然可以在某种程度上保留方法名称,但它的主体不可用。 其中的方法调用分散在整个生成的文件中,因此,它们不能在JavaScript库中使用,这是本主题的重点。

虽然您可以将编译器设置为输出“漂亮”代码,但我建议您为要从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() {this.instance.@your.package.name.YourClass::yourMethod()()} }-*/; } 

编辑

详细说明,您的代码将像平常一样进行模糊处理,但由于导出function,您可以轻松地在外部引用这些function。 您不必在JavaScript中重写Java类中的任何内容。 您只能在JavaScript中编写引用,因此您可以这样做:

 var myInstance = new YourClass(); myInstance.yourMethod(); 

当然,您必须从GWT应用程序中的某个位置(最有可能在您的EntryPoint中)调用静态导出方法才能使其工作。

有关从JavaScript引用Java方法的更多信息: http : //code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html#methods-fields

否 – 这是GWT编译器无法实现的,因为构建GWT编译器是为了用Java生成优化且性能非常好的JavaScript。

最大的优点是,您可以在Java中维护您的项目并使用GWT将其编译为JavaScript。 因此,无需在JavaScript结果中阻止变量名和方法名,因为所有更改和工作都在JAVA源中完成。

在GWT的JavaScript输出中工作并不是那么容易,而且真的很多工作!

更新

通过David的一丝暗示,我找到了Compiler-Option“ -style ”。 您可以尝试使用以下选项:

 -style=PRETTY -optimize=0 

我不知道这是否真的会产生“人类可读”的代码。 我认为它不会,因为GWT框架仍然是生成的JavaScript的一部分,因此很难对JavaScript结果进行更改。 试试让我们知道……

也许我可以回答你的第二个问题:“如果GWT编译器不能这样做,可以使用其他工具吗?”

我现在使用Java2Script已经有一段时间了,也在很大的项目上。 与原生JavaScript集成很好,名称被保留,并且在一段时间之后,甚至可以轻松地将生成的JavaScript(在浏览器调试器中)与原始Java代码匹配。

你做

您可以通过编写调用它的内联JavaScript来“导出”您的函数,并且有一个工具gwt-exporter在您使用@Export和类似注释类和方法时自动执行此操作。 更多信息: https : //code.google.com/p/gwtchismes/wiki/Tutorial_ExportingGwtLibrariesToJavascript_en