使用GWT编译器从Java到JavaScript

使用GWT编译器从Java到JavaScript,java,javascript,gwt,Java,Javascript,Gwt,我编写了一些Java代码,希望将其转换为JavaScript。 我想知道是否可以使用GWT编译器将上述Java代码编译成JavaScript代码,保留所有方法、变量和参数的名称。 我尝试使用-draftCompile关闭代码优化来编译它,但是方法名被破坏了。 如果GWT编译器不能做到这一点,可以使用其他工具吗 更新 Java代码只依赖于GWT仿真类,因此GWT编译器肯定能够处理它 更新2 此Java方法: public String method() 已转换为此JavaScript函数: fu

我编写了一些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编译器运行它,要么保持方法名称不变,要么以可预测的方式更改它,这样我就可以检测它并知道如何将它更改回sort()。然后,我可以将该代码放入JavaScript应用程序并使用它。如果Java版本发生变化,我也可以自动重新生成它。我有一个很好的理由,从技术上来说,我理解GWT的概念,我只是在寻找这一点的答案

结论

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

否-这在GWT编译器中是不可能的,因为GWT编译器的构建是为了用Java生成优化且性能非常好的JavaScript

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

在GWT的JavaScript输出中工作并不是那么容易,而且确实需要做很多工作

更新

根据David的提示,我找到了编译器选项“-style”。您可以使用以下选项进行尝试:

-style=PRETTY -optimize=0

我不知道这是否真的会生成“人类可读”的代码。我认为不会,因为GWT框架仍然是最终JavaScript的一部分,因此很难对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()()}
    }-*/;
}
编辑

更详细地说,您的代码将像普通代码一样变得模糊,但由于导出功能,您可以轻松地从外部引用这些函数。您不必用JavaScript重写Java类中的任何内容。您只能使用JavaScript编写引用,因此可以执行以下操作:

var myInstance = new YourClass();
myInstance.yourMethod();
当然,您必须从GWT应用程序中的某个地方(最有可能在您的入口点)调用静态导出方法才能实现这一点

有关从JavaScript引用Java方法的更多信息:

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

我使用了相当长的一段时间,也在相当大的项目。与本机JavaScript的集成很好,名称被保留下来,一段时间后,甚至可以轻松地将生成的JavaScript(在浏览器调试器中)与原始Java代码进行匹配


Udo

您可以通过编写调用函数的内联JavaScript来“导出”函数,并且有一个工具,当您使用
@export
和类似工具注释类和方法时,它会自动执行此操作。更多信息:

为什么这个答案会被否决?这对我来说很有意义。将Java语义映射到JavaScript通常是一个非常困难的问题,GWT通过针对web客户机行为等简化了这个问题。这是不正确的。GWT编译器有优化选项,也有完全不压缩输出的选项(漂亮或详细)。提问者说他想知道这是否可能,而不是使用GWT有什么好处。@David最初的问题没有对Java源代码的性质进行任何描述。例如,GWT只支持一小部分标准JDK库。在一般情况下,“只是一些Java代码”,而这些代码最初不一定是为目标GWT编写的,GWT很可能完全无用。生成的编译器输出将在GWT项目之外使用,因此必须可读。@Pointy我假设海报理解这一点,也许他可以澄清一下。我假设问题是,假设他有数学、集合和其他基本操作(即没有小部件、输入操作等),他能将用Java编写的代码翻译成JavaScript并对这些方法执行调用(并且希望函数名是可预测的)。我投了反对票,赞成回答说必须优化GWT输出,这一点现在已经澄清并删除了。否-您可以自己查看编译器标志:没有选项以所需的方式更改编译器行为。是否使用-style PRETTY而不是DETAILED进行测试-也许可以这样做。部分是否来自“$”向前推进一些预测