我有一组定义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 */
}
和
我是否可以使用工具以自动方式进行此分离,或者我是否必须使用自己的程序来完成这项工作?它需要是一种需要最少互动的工具。
答案 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提供的指导性帮助可能是最好的折衷方案。开心点;它比手工操作每一步都要少得多乏味!