从Java类中提取接口的自动方法

时间:2011-01-07 04:56:11

标签: java interface refactoring

我有一组定义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 */
 }

我是否可以使用工具以自动方式进行此分离,或者我是否必须使用自己的程序来完成这项工作?它需要是一种需要最少互动的工具。

4 个答案:

答案 0 :(得分:5)

我找到了解决方案!

Eclipse,支持重构脚本,脚本是xml但不是非常友好,但我生成的脚本无论如何都让eclipse执行所有的重构。

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

答案 1 :(得分:3)

许多IDE(如IntelliJ)都有一个“Extract Interface”命令,可以为您执行重构:http://www.jetbrains.com/idea/features/refactoring.html#Extract_Interface

答案 2 :(得分: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。

答案 3 :(得分:1)

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