【问题标题】:Automated way to Extract Interfaces from a Java Class从 Java 类中提取接口的自动化方法
【发布时间】:2011-01-07 04:56:10
【问题描述】:

我有一组定义 API 的具体类,我想从 API 的实际实现中提取这些类的接口(即:本质上是类型层次结构和公共方法)。

例如,如果 API 中的公共类之一是

 public class Foo extends Bar {
     /* some fields which I don't care about */

     public void method() {
     /* implementation here */
     } 

     public void otherMethod() {
     /* implementation goes here */
     }

    /* some non public methods which I don't care about */

 }

我想分成一个接口和一个实现

public interface FooInterface extends BarInterface {
    public void method();
    public void otherMethod()
}

 public class Foo implements FooInterface {
  /* etc etc */
 }

有没有一种工具可以让我以自动化的方式进行这种分离,还是我必须推出自己的程序才能完成这项工作?它需要是一个需要最少交互的工具。

【问题讨论】:

    标签: java interface refactoring


    【解决方案1】:

    我找到了解决办法!

    Eclipse,支持重构脚本,脚本是 xml 格式,但不是很人性化,但无论如何我已经生成了脚本,让 eclipse 执行所有重构。

    有关 eclipse 脚本重构的详细信息,look here 并使用 eclipse 为您生成一些示例,以便您知道脚本应该是什么样子

    【讨论】:

    • 这正是我正在寻找的(我有你提到的确切场景)!您有机会分享您使用的重构脚本吗?我将在 Eclipse 中探索以解决这个问题,但我可以使用任何帮助。提前致谢!
    • 哇,“脚本”中生成的 XML 并不漂亮(从 Eclipse Indigo 开始)。如果我从中得到有用的东西,会回来报告。
    【解决方案2】:

    许多 IDE,例如 IntelliJ,都有一个“提取接口”命令,可以为您执行重构:http://www.jetbrains.com/idea/features/refactoring.html#Extract_Interface

    【讨论】:

    • 它可以同时处理多个文件吗?假设选择包中的所有类并执行接口提取?
    • 如果您为了“纯度”而对所有文件执行此操作,我建议您重新考虑您实际获得的好处。就个人而言,我会在有意义的地方和时间提取界面,并将其他所有内容保持原样。但是,我不知道你的推理。
    • 不是为了“纯”,也不会是每一堂课,但是一个一个做会很繁琐。
    【解决方案3】:

    javap 是 JDK 中的一个工具,它将为您提供大部分您想要的东西。但是,请准备好它无法正确处理某些事情 - 对不起,我忘记了什么,也许是注释,内部类,类似的东西。

    如果在您自己的 Java 应用程序中嵌入 javap 会有所帮助,您可以执行以下操作:

    import sun.tools.javap.Main;
    ...
        void javap(String className) throws IOException
        {
            bos = new ByteArrayOutputStream();
            ourOut = new PrintStream(bos);
    
            PrintStream oldOut = System.out;
            System.setOut(ourOut);
    
            String[] params = new String[] {"-public", className};
            Main.main(params);
    
            System.setOut(oldOut);
    
            String str = bos.toString();
         }
    

    这需要类路径中的 Sun JDK tools.jar。

    【讨论】:

      【解决方案4】:

      我很确定您必须使用自己的工具来完成这项工作;它不是许多开发人员会使用的东西,那些使用它的人也不会经常使用它。提取接口,要做好,真的需要智能(真正的那种)来指导它。盲目提取所有公共和受保护元素,并盲目构建接口层次结构以反映实现层次结构的工具远非智能,最终产品也不会漂亮。开发(人工智能)智能来做出关于包含什么和引出什么的正确决定——这将是一个有用的工具,但我承认对我来说是难以想象的困难。当前的 IDE 提供的 - 指导性帮助 - 可能是最好的折衷方案。开心点;这比手动完成每一步都简单得多!

      【讨论】:

      • 我同意总的来说输出不会很漂亮,但它是一个起点,它恰好是我在这种特殊情况下所需要的(我想要折射的 API 实际上是自动生成的另一个工具,因此结构实际上定义良好,因此在这种情况下重构工具可能非常聪明)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2011-09-16
      • 2019-02-10
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多