智能搜索和生成Java代码,最好使用Python?

3 投票
3 回答
790 浏览
提问于 2025-04-15 21:57

基本上,我经常需要生成一次性的代码,进行大规模的重构等等,都是在Java中进行的。

我喜欢用Python来做这些事情,但如果你有其他的解决方案,我也愿意尝试。


下面是一个简化版的示例,展示我想要的功能,用伪代码表示。

为接口生成实现

search within my project:
  for each Interface as iName:
    write class(name=iName+"Impl", implements=iName)
    search within the body of iName:
      for each Method as mName:
        write method(name=mName, body="// TODO implement this...")

我希望找到的工具可以让我做到以下几点:

  • 根据Java的结构解析文件(比如“查找接口”)
  • 根据语言元素和类型查找相关的词汇(比如“SomeClass类型的变量”,“对SomeClass实例调用doStuff()方法”)
  • 在特定的结构上下文中进行搜索(比如“在当前结果的主体内”)
  • 轻松替换或生成代码(可以用一些辅助工具来生成,或者用函数来替换,比如“把接口重命名为Foo”,“插入这一行Blah.Blah()”等等)

关键是,我不想花太多时间在这些事情上,因为它们通常都是一次性的。但有时候我需要的功能比grep提供的要聪明一点。写一个简单版本的工具并不难,但如果我真的要用这样的工具,我希望它能更稳定。

有没有推荐的工具或库可以帮助我实现这些功能?


编辑以添加一些说明

  1. Python并不是必须的;我愿意尝试其他的选择。我只是提到Python是因为可能有相关的选项。
  2. 这个工具是要和IDE的重构功能结合使用的;有时候IDE的功能并不能满足我的所有需求。
  3. 在我使用代码生成的情况下(如上所述),是为了增强其他代码生成器的输出。例如,我们使用的一个库生成了大量的接口,而我们需要为每个接口创建标准实现,以便与我们的代码库结合。

3 个回答

0

现在,Java常常受到一些批评,但在工具方面,这种批评是不公平的。

我们有很多选择;Eclipse、Netbeans和Intellij是三大主流开发环境。它们都提供了很棒的搜索和重构功能。我觉得Eclipse在某些方面比Netbeans更好,而Intellij通常又比Eclipse更强。

你还可以使用一些静态分析工具,比如FindBugs和CheckTyle,来发现代码中的问题,比如方法和类过长,或者代码过于复杂。

如果你想充分利用你的Python技能,可以看看Jython。它是一个用Java写的Python解释器。

0

如果你在用Java编程,我强烈建议你使用NetBeans IDE。它自带了这种重构的支持。Eclipse也支持这种功能(不过我个人更喜欢NetBeans)。这两个项目都是开源的,所以如果你想看看它们是怎么实现重构的,可以查看它们的源代码。

2

首先,我不知道有没有专门为重构Java代码而设计的Python工具或库,谷歌搜索也没有找到相关信息。

其次,我认为要用Python写一个不错的Java重构工具或库是个大工程。你需要在Python中实现一个Java编译器的前端(包括词法分析器、语法分析器、抽象语法树构建器和类型分析器),然后还要想办法把这些和程序编辑器结合起来。考虑到已经有成熟的替代方案,我并不惊讶没有人做这个……

第三,如果在没有全面分析源代码的情况下进行重构(比如仅仅使用模式匹配),那么就无法进行复杂的重构,而且可能会在一些边缘情况下出错,这些情况可能是实现者没有考虑到的。我猜这就是提问者目前的情况……

鉴于这种不太乐观的前景,还有哪些替代方案呢:

一个选择是使用现有的Java集成开发环境(IDE)(例如NetBeans、Eclipse、IDEA等)作为重构工具。提问者可能无法用Python代码扩展这些工具的功能,但他很可能根本不需要这样做。我认为至少有一个IDE可以满足他95%的需求,如果他能保持现实,这就足够了。特别是考虑到IDE有很多附加功能,可以帮助简化重构,比如结构化编辑、撤销/重做、增量编译、智能代码补全、智能搜索、类型和调用层次视图等等。

(顺便说一下……如果现有的IDE不够好(@WizardOfOdds - 只有提问者自己能判断!!),那么尝试扩展现有IDE的重构能力比重新开始用其他编程语言实现更有意义。)

根据他实际在做什么,基于模型的代码生成可能是另一个选择。例如,如果重构是因为他经常创建和重新创建对象模型,那么一个替代方案是用某种建模语言编写模型,并从这些模型生成代码。我在做这类事情时喜欢使用Eclipse EMF及相关技术。EMF技术包括编辑器生成、XML序列化、持久化、查询、模型到模型的转换等等。我曾用EMF实施和推出过包含50到100个不同类、具有复杂关系和验证要求的对象模型项目。EMF在从更新后的模型重新生成代码时支持合并源代码编辑,这是一个关键特性。

撰写回答