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
- GWT,Eclipse插件如何将项目与.gwt.xml文件一起重命名? 尝试这样做时会出错
- 如何使用GWT动态更新SelectionCell中的选项?
- GWT:在服务器代码中访问i18n消息
- 迁移到Spring 3后,从Eclipse IDE启动基于Maven的GWT App时出现Spring NamespaceHandler问题
- GWT Java仿真
- 用于GWT的SQLite DB?
- 使用hibernate和gilead for gwt添加到实体类中保存的列表时的LazyInitializationException
- GWT IncompatibleRemoteServiceException
- Gwt编辑器不仅具有getter / setter bean类