列出所有不再使用的已弃用类/方法的工具?

3

我需要清理一些旧代码。删除未使用的代码是重要的一步。

有没有一种工具可以查找所有已弃用的代码,删除所有仍在某处使用的项目,并给我列出未使用的弃用代码的列表?

额外加分:是否有一种工具可以查找未使用的非弃用代码?

我知道这永远不会完美,但我知道哪些情况需要特殊处理(例如数据库驱动程序或通过 DI 引用的类)。


很多年前在以前的一份工作中,他们使用商业混淆器运行我们的代码。其中之一的事情是删除未使用的类和方法,这意味着您必须指出可能通过反射调用或是 API 方法被调用的任何类或方法,以便它们不会被删除或重命名。 - Paul Tomblin
你对使用@Deprecated注释的方法感兴趣吗?如果是这样,编写一个列出所有带注释方法和相应类名的工具应该很容易(使用反射)。 - helpermethod
@助手:那只是工作的1%。难点在于定位所有调用站点。 - Aaron Digulla
5个回答

3
我不完全确定是否理解了你的问题。你想要一个工具来取消使用过时注释的代码吗?任何IDE都可以帮助你完成这个任务。虽然不能自动完成,但是通过全局搜索和替换很容易去除@Deprecated注释。当你移除未使用的代码之后:

如果你只是想移除未使用的代码,在以前的项目中我曾使用eclipse插件ucdetector。它虽然不能直接移除未使用的代码,但是会提供一个没有引用的方法、类和常量列表,方便你手动移除。这是一个不错的选择。

正如你所指出的,有些类或方法在静态分析上可能看起来未被使用。在我看来,这使得自动化此任务变得不可能。你作为编码者需要分析所有被报告未被使用的代码块。

如果你足够幸运能够拥有优秀的测试覆盖率,另一个选择是使用代码覆盖率分析工具,如cobertura、clover或emma。


ucdetector似乎朝着正确的方向发展。首先,我需要找出所有没有被使用的类/方法。然后,我可以从中删除公共API。之后,我可以检查所有XML配置文件中仍在使用的类等。 - Aaron Digulla
我检查过了,ucdetector是我需要的。它允许注释,因此我可以记录某些东西仍在使用(以及在哪里)。 - Aaron Digulla

0

使用 Spoon 库来转换 Java 源代码:

String path = "src/main/java";
Launcher spoon = new Launcher();
spoon.addInputResource(path);
spoon.setSourceOutputDirectory(path);
spoon.addProcessor(new AbstractProcessor<CtMethod>() {
        @Override
        public void process(CtMethod method) {
                if (method.hasAnnotation(Deprecated.class)) {
                        method.delete();
                }
        }
});
spoon.getEnvironment().setPrettyPrinterCreator(() -> {
                        return new SniperJavaPrettyPrinter(spoon.getEnvironment());
                }
);
spoon.run();

请查看方法removeDeprecatedMethods


这也会删除仍然被某人调用的方法。我该如何过滤它们? - Aaron Digulla
1
是的,再加上几行代码,创建了 https://github.com/INRIA/spoon/issues/3195 以供参考。 - Martin Monperrus

0

我认为这可以满足你的需求,但会忽略@Deprecated。我记得它会在项目的上下文菜单中添加一个选项来查找未使用的方法。

http://eclipse-tools.sourceforge.net/


这些工具已经被合并到 Eclipse 中。有任何想法它们最终在哪里了吗? - Aaron Digulla
我在3.6.1中没有看到过类似的东西。 - gub

0

IntelliJ在我输入时会识别它们。我不确定是否有自动删除它们的选项。


整个项目还是仅当前类?也就是说,它是否告诉你有哪些未被调用的公共方法? - Aaron Digulla
你可以在整个项目中找到用法,但我认为这是基于类和方法的。 - duffymo

0

不确定你的问题有点难以理解...... 对我来说,Stack Overflow 主要是关于代码问题的,所以我假设你想要一种获取所有带有 @Deprecated 注释的方法的方式...

因此,基本上你需要研究 Java 反射。

例如,假设你想要 Date 类中(Java.util.Date)所有过时方法,这就是你可以做的...

Class<?> clazz = Date.class; //Getting Class Obj of the Date Class

    Method[] methods = clazz.getDeclaredMethods(); //Getting methods


    for (Method m : methods) { //Inhanced For-Loop To get them-all 
        for (Annotation a : m.getAnnotations()) {
            if (a instanceof Deprecated) {
                System.out.println(m.getName()); // gitting the Methods Names
            }
        }

    }

1
这并不能告诉我们是否仍然有人在使用这种方法。 - Aaron Digulla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接