使用 GWT 编译器的 Java 到 JavaScript

2022-09-04 00:57:45

我写了一些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库中使用,这是本主题的全部重点。


答案 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() {this.instance.@your.package.name.YourClass::yourMethod()()}
    }-*/;
}

编辑

为了详细说明,您的代码将像往常一样被混淆,但是由于导出功能,您可以轻松地在外部引用这些函数。你不必用 JavaScript 重写 Java 类中的任何内容。你只用JavaScript编写引用,所以你可以这样做:

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

当然,您必须从GWT应用程序中的某个位置调用静态导出方法(最有可能在InternetPoint中)才能实现此目的。

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


答案 2

不 - 这对于GWT编译器是不可能的,因为GWT编译器是为从Java中生成优化且性能非常高的JavaScript而构建的。

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

在GWT的JavaScript输出中工作并不容易,而且真的需要做很多工作!

更新

通过David的暗示,我发现了编译器选项“-style”。您可以尝试使用以下选项:

-style=PRETTY -optimize=0

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