Java到JavaScript使用GWT编译器

Bor*_*kov 14 javascript java gwt

我编写了一些Java代码,我想将其转换为JavaScript.我想知道是否可以使用GWT编译器将提到的Java代码编译成JavaScript代码,保留方法,变量和参数的所有名称.我尝试使用-draftCompile关闭代码优化来编译它,但是方法名称被破坏了.如果GWT编译器不能这样做,可以使用其他一些工具吗?

更新

Java代码只依赖于GWT模拟类,因此GWT编译器肯定能够处理它.

更新2

这个Java方法:

public String method()
Run Code Online (Sandbox Code Playgroud)

翻译成这个JavaScript函数:

function com_client_T_$method__Lcom_client_T_2Ljava_lang_String_2()
Run Code Online (Sandbox Code Playgroud)

使用编译器选项:

-style DETAILED
-optimize 0
-draftCompile
Run Code Online (Sandbox Code Playgroud)

所以名称不能保留.但有没有办法控制它们的变化?

澄清

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

结论

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

roe*_*kok 10

虽然您可以将编译器设置为输出"漂亮"代码,但我建议您为要从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()()}
    }-*/;
}
Run Code Online (Sandbox Code Playgroud)

编辑

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

var myInstance = new YourClass();
myInstance.yourMethod();
Run Code Online (Sandbox Code Playgroud)

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

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

  • 但是您可以使用此方法来标识编译器创建的相关JavaScript函数.你问了一个可预测的命名方案,就是这样!`window.YourClass.yourMethod`将指向JavaScript中新的混淆名称. (2认同)

Eri*_*rik 6

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

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

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

更新:

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

-style=PRETTY -optimize=0
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

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

你做