有没有办法自动将Groovy转换为Java?

时间:2011-03-14 17:27:30

标签: java plugins groovy code-translation

我继承了大量的Groovy代码,但由于以下几个原因,我发现很难维护:

  1. 很多时候很难说变量的类型是什么。
  2. 推论:可以很容易地修改具有不同类型的变量,而不是意识到它。
  3. 在运行期之前会发现很多错误(如果您的单元测试几乎不包含所有内容,那就太可怕了。)
  4. 基本上忽略了参数的类型。
  5. 我正在使用的IDE(STS Pro)很有用,但远远落后于Java。例如,重构是不可用的。
  6. 有时可以提供建议,有些则没有。
  7. 虽然我很欣赏这种语言的紧凑性,但维护工作既困难又繁琐。

    我试图手动将一些部分转换为Java,这很痛苦。您是否了解有助于此转换的任何工具或插件?

8 个答案:

答案 0 :(得分:24)

IntelliJ IDEA对重构groovy代码有相当不错的支持。 它还有一个Groovy的源代码级转换器 - > Java的。大多数情况下它会生成无法编译的代码,但它可能有助于您开始转换代码的过程。 Groovy代码:

class HelloWorld {
def name
def greet() { "Hello ${name}" }
int add(int a, int b) {
    return a+b;
}
}

转换的Java代码:

public class HelloWorld {
public GString greet() {
    return "Hello " + String.valueOf(name);
}

public int add(int a, int b) {
    return a + b;
}

public Object getName() {
    return name;
}

public void setName(Object name) {
    this.name = name;
}

private Object name;
}

答案 1 :(得分:15)

可能不是你想听到的答案,但我会专注于使用Groovy变得更加舒服,而不是试图将代码转换为Java。你可以在Groovy中做很多事情,这些事情根本不能很好地转换为Java(如closures)。任何自动转换为Java都会使代码的可读性降低,难以理解。

如果你不能被说服坚持使用Groovy,并且你必须迁移到Java,你最好的选择是手工完成。

答案 2 :(得分:4)

Groovy和Java语言都编译为相同的字节码(Java Platform Bytecode)。所以只需(a)将.groovy文件编译为.class文件; (b)使用JDGUI等反编译器将.class文件反编译为.java文件。

答案 3 :(得分:3)

我的最佳提示是编写大量单元测试

这种建议适用于大多数动态语言,因为编译器对静态类型检查的“安全网”较少。您需要添加测试以检查输入和输出值是否具有正确的类型等。

我认为这将解决您的大多数问题。

答案 4 :(得分:3)

我使用Groovy ++找到并替代解决方案。它几乎具有Groovy的所有优点,但具有Java的性能和强大的类型。此外,它基于Groovy,因此显然您只需添加一个jar文件,并在代码顶部添加“@Typed”注释。

此外,它增加了一些新功能,例如“GrUnit”,并允许混合动态和静态类型,我希望这将允许创建DSL。因此它允许与现有的Groovy代码混合,并与Grails一起使用。

该项目似乎很年轻,但真正有前途。我已经在测试水域,并检查我能走多远。

所以,这个答案实际上没有说明如何将Groovy转换为Java,但你可以得到更好的东西:两个世界加上可选的第三世界的好处 - 没有双关语意图:-) - 静态类型和性能

答案 5 :(得分:0)

一年前有一些问题。经过一两个月的狂热兴奋之后,现实世界变弱了。即使是GReclipse 2.0也不会减少痛苦,代码变得无法管理和痛苦。 简短回答你的问题 - 没有。没有一个真正好的工具来做到这一点。 GSql我用Spring JdbcTemplate替换,带有回调的闭包。所有这一切都需要手动决定替换策略,所以如果你想获得一个好的代码,你需要做到直截了当。否则你可能会使用一些java反编译器,但我认为这不是你真正想要的。

答案 6 :(得分:0)

我们会将大约1000个Groovy类更改为Java 8。

  • 自动:我认为它可以与手动步骤结合使用

迁移的可能步骤

  • def变量:使用IDE中的正确类名手动替换

  • def Methodes:使用正确的类名手动替换为IDE中的返回值

  • 文件重命名:自动将所有.groovy文件替换为.java文件(Java 8)

  • clousures:用Java 8 Lambdas和Java 8 Streams手动替换

  • Groovy overritten Methodes:用新的Java jdk Klasses手动替换,即New File io,New Date API或包含Apache Libraries

使用单元测试来控制重构。

PS:我们用了。使用Groovy插件的Eclipse。

问候Roebi

答案 7 :(得分:0)

对于有类似问题的人,您可以查看GMavenPlus