0

我正在使用一个为我生成大量 java 代码的 API。

但是这个 API 不能正确处理导入,所以它写了每个类的完整限定名。例如:

public class Foo{
    com.my.company.Bar bar;
    public com.my.company.Bar getBar(){
      return bar;
    }
}

我想找到一个 API 来处理这个生成的代码并编写类似的东西:

import com.my.company.Bar;

public class Foo{
    Bar bar;
    public Bar getBar(){
      return bar;
    }
}

是否有任何已知的 API 能够做到这一点?

4

2 回答 2

0

据我所知,您希望生成 Java 代码,对吗?如果是 。我们Eclipse JDT在我们的项目中Eclipse IDE使用它,他们使用它来生成 Java 代码。我鼓励使用它,但是根据需要,您可能会选择简单的解决方案QDox,甚至其他解决方案。

您可以考虑其中一种解决方案

  • 日食 JDT
  • Java解析器
  • Qdox

日食 JDT

优点

  • 令人印象深刻的功能
  • 非常丰富的API
  • 支持 Java 7 功能,他们还计划支持 Java 8 功能
  • 可本地化的语法错误消息

骗局

  • 陡峭的学习曲线

资源 Eclipse JDT 简介

http://www.eclipse.org/articles/article.php?file=Article-JavaCodeManipulation_AST/index.html

如何在 Eclipse 之外使用 JDT API

如何在 Eclipse 之外的项目中使用 java Eclipse 抽象语法树?(即不是 Eclipse 插件)

AST 上的好例子和项目

http://www.ibm.com/developerworks/opensource/library/os-ast/

访问 Eclipse jar 插件源

http://www.vogella.de/articles/EclipseCodeAccess/article.html

测试样品

http://git.eclipse.org/c/jdt/eclipse.jdt.core.git/tree/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests

Qdox

专业人士

  • 从头开始构建和修改
  • 轻的
  • 基于 FQN 类型的搜索
  • 干净可读的 API
  • 广泛的查询可能性,例如 isFinal()、isPrivate()
  • 面向对象的结构,Java 文件中的几乎所有内容都可以用 JavaClass、JavaField、JavaMethod、JavaParmeter 等对象来表示

骗局

  • 上次公开发布是 2009 年 9 月 4 日的 1.10,如何获得 2.0 快照
  • 1.10 不支持静态导入;
  • 写入文件是预先格式化的,没有太多的控制权,不能指定行号
  • 没有文章和教程,源代码是唯一的参考

资源 - Qdox http://qdox.codehaus.org/changes-report.html

于 2013-11-08T15:39:11.330 回答
0

从现有代码中过滤导入并非易事。假设您有两个名称相同但包不同的类。

我通常的方法是有一个助手类来为我管理导入。在生成器中,我可以

String type = importSet.add(Foo.class);

type然后在方法中使用来访问类型。导入集收集所有导入并处理重复项。

为此,您需要这个“主循环”:

importSet = new ImportSet();
String body = generateClass();

out.write(importSet);
out.write(body);

即,您需要首先为类本身生成所有代码(在进行时收集导入。然后将导入写入文件,然后生成生成的类体。

如果您想更改源代码,我建议使用Eclipse Java 编译器,因为它可以为您提供代码的 AST。然后,您可以在此树上应用各种转换。我的博客中有一个如何获取 AST 的示例

于 2013-11-08T14:48:05.297 回答