我编写了一些 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 编译器运行它,要么保持方法名称不变,要么以可预测的方式更改它,这样我就可以检测到它并知道如何将它改回排序( ).然后我可以将该代码放入我的 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()()}
}-*/;
}
编辑
具体来说,您的代码将像往常一样被混淆,但由于导出功能,您可以轻松地从外部引用这些函数。您不必用 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 编译器从 Java 到 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8417809/