有没有办法自动将Groovy转换为Java?
我inheritance了大量的Groovy代码,我发现很难维护它有几个原因:
- 通常很难说变量的类型是什么。
- 推论:很容易修改具有不同类型的变量,而不是意识到它。
- 在运行期之前会发现许多错误(如果您的unit testing几乎不包括所有内容,那就太可怕了)。
- 基本上忽略了参数的类型。
- 我正在使用的IDE(STS Pro)很有用,但远远落后于Java。 例如,重构是不可用的。
- 有时可以提供建议,有些则不是。
虽然我很欣赏这种语言的紧凑性,但维护工作既困难又繁琐。
我试图手动将一些部分转换为Java,这很痛苦。 您是否了解有助于此转换的任何工具或插件?
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; }
可能不是你想听到的答案,但我会专注于使用Groovy变得更加舒服,而不是试图将代码转换为Java。 你可以在Groovy中做很多事情,这些事情根本不能很好地转换为Java(比如闭包 )。 任何自动转换为Java都会使代码的可读性降低,难以理解。
如果你不能被说服坚持使用Groovy,并且你必须迁移到Java,你最好的选择是手工完成。
Groovy和Java语言都编译为相同的字节码(Java Platform Bytecode)。 所以只需(a)将.groovy文件编译为.class文件; (b)使用JDGUI等反编译器将.class文件反编译为.java文件。
我的顶尖提示是写了很多unit testing 。
这种建议适用于大多数动态语言,因为编译器对静态类型检查的“安全网”较少。 您需要添加测试以检查输入和输出值是否具有正确的类型等。
我认为这将解决你的大多数问题。
我使用Groovy ++找到并替代解决方案。 它几乎具有Groovy的所有优点,但具有Java的性能和强大的类型。 此外,它基于Groovy,因此显然您只需添加一个jar文件,并在代码顶部添加“@Typed”注释。
此外,它增加了一些新function,例如“GrUnit”,并允许混合动态和静态类型,我希望这将允许创建DSL。 因此它允许与现有的Groovy代码混合,并与Grails一起使用。
该项目似乎很年轻,但真正有前途。 我已经在测试水域,并检查我能走多远。
所以,这个答案实际上并没有说明如何将Groovy转换为Java,但你可以获得更好的东西:两个世界加上可选的第三世界的好处 – 没有双关语: – ) – 静态类型和性能。
一年前有一些问题。 经过一两个月的狂热兴奋之后,现实世界变弱了。 即使是GReclipse 2.0也不会减少痛苦,代码变得无法管理和痛苦。 简短回答你的问题 – 没有。 没有一个真正好的工具来做到这一点。 GSql我用Spring JdbcTemplate替换,带有回调的闭包。 所有这一切都需要手动决定替换策略,所以如果你想获得一个好的代码,你需要做到直截了当。 否则你可能会使用一些java反编译器,但我认为这不是你真正想要的。
我们将大约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
使用unit testing来控制重构。
PS:我们用了。 Eclipse与Groovy插件。
问候Roebi
对于有类似问题的人,你可以看看GMavenPlus
- 如何在不使用-cp开关的情况下在Groovy中自动加载数据库jar?
- Groovy可以在POJO上动态添加或覆盖方法吗?
- 异步执行多个任务并在JavaScript函数中返回第一个成功的结果
- 具有临时Web报告的Java商业智能框架?
- 即使我在正确的域上,Selenium addCookie也会获得无效的Cookie域exception
- 通过Groovy在Java中进行XML解析
- 在java 8中的groovy和闭包中的闭包(lambda表达式)?
- 将文件转换为MultiPartFile
- Spring Tool Suite(STS)3.5.0 – org.codehaus.groovy.eclipse在求解器中是未知的