Java代码使用检查器
我正在一个图书馆工作,我们想确定我们的图书馆有多少被使用。也就是说,我们想知道库中有多少方法是公共的,但从未被调用 目标: 静力分析Java代码使用检查器,java,code-coverage,static-analysis,Java,Code Coverage,Static Analysis,我正在一个图书馆工作,我们想确定我们的图书馆有多少被使用。也就是说,我们想知道库中有多少方法是公共的,但从未被调用 目标: 静力分析 确定在当前项目中调用包A中每个公共方法的代码行数。如果调用数为零,则应将该方法报告为零。以下是一些Java代码覆盖工具列表。我个人没有使用过这些,但这可能会让你开始: 不完全是您想要的,但是: 类似的事情可以通过代码覆盖工具(比如)来完成。它们不会对源代码进行静态检查,而是在运行时检测字节码以收集度量。当然,您需要以一种练习所有使用模式的方式驱动应用程序,并
确定在当前项目中调用包A中每个公共方法的代码行数。如果调用数为零,则应将该方法报告为零。以下是一些Java代码覆盖工具列表。我个人没有使用过这些,但这可能会让你开始:
- 是一种检查Java库与旧版本的二进制和源代码兼容性的工具。基本上,您给它两组jar文件,Clirr在公共api中转储一个更改列表李>
- 是一个Javadoc doclet,当比较两个API时,它生成一个HTML报告,其中包含所有以任何方式删除、添加或更改的包、类、构造函数、方法和字段,包括它们的文档李>
- 如果游戏库的使用统计数据为“正常”或“异常值”,那么定义是什么?太频繁地在游戏中自杀是不对的吗?你会像一个优秀的玩家一样更频繁地使用“killScreen”类
- 什么定义“很多”?时间或使用计数?POJO将消耗很少的时间,但使用非常频繁
- 不必要(死)代码
- 可将可见性更改为受保护、默认或默认的代码 私人
- 字段的方法,可以是final
- 列出死代码,以便从源代码中删除。
- ……”
- 将为每个声明的方法调用ClassVisitor的visitMethod(..)
- 将为每个调用的方法调用MethodVisitor的visitMethodInsn(..)
- 不完全是您想要的,但是:
类似的事情可以通过代码覆盖工具(比如)来完成。它们不会对源代码进行静态检查,而是在运行时检测字节码以收集度量。当然,您需要以一种练习所有使用模式的方式驱动应用程序,并且可能会错过更罕见的代码路径
在静态分析方面,也许这些工具可以帮助您(Apache项目使用它们来检查新版本的API兼容性,似乎这项任务与您正在尝试做的事情有点相关):
这里有一些简单的问题:
我不知道你想完成什么。
如果您想显示代码依赖项,还有其他方法可以实现这一点。如果您试图度量代码的执行情况,那么Java有很多方法。如果你是一个统计极客,你会很高兴;)
祝你好运 我建议JDepend向您展示包和类之间的依赖关系,非常适合查找循环依赖关系! (它有一个eclipse插件: 以及其他指标的PMD
我相信您正在寻找这个eclipse插件--> 从文件(付款通知到第二个要点)
在更大范围内,如果你想做对象级静态分析,从IBM ->查看这个工具。它对于库、API等的对象分析非常有帮助。
> P>客户端使用反射调用是静态分析中的一个洞。因为没有办法确切地知道某个特定的方法不是通过一些奇异的调用来调用的。因此,运行时和静态分析的结合可能是最好的。
Proguard也可能是一个选项(): “ProGuard的一些用途包括:另请参见您可以使用ASM字节码分析库()编写自己的实用程序(在阅读本文后一小时内)。您需要实现ClassVisitor和MethodVisitor。您将使用ClassReader解析库中的类文件
class MyClassVisitor {
// ...
public void visit(int version, int access, String name, ...) {
this.className = name;
}
public MethodVisitor visitMethod(int access, String name, String desc, ...):
String key = className + "." + name + "#" + desc;
if (!map.containsKey() {
map.put(key, 0);
}
return new MyMethodVisitor(map);
}
// ...
}
void class MyMethodVisitor {
// ...
public visitMethodInsn(int opcode, String name, String owner, String desc, ...) {
String key = owner + "." + name + "#" + desc;
if (!map.containsKey() {
map.put(key, 0);
}
map.put(key, map.get(key) + 1);
}
// ...
}
基本上就是这样。你的节目是这样开始的:
Map<String,Integer> map = new HashMap<String,Integer>();
for (File classFile : my library) {
InputStream input = new FileInputStream(classFile);
new ClassReader(input).accept(new MyClassVisitor(map), 0);
input.close();
}
for (Map.Entry<String,Integer> entry : map.entrySet()) {
if (entry.getValue() == 0) {
System.out.println("Unused method: " + entry.getKey());
}
}
Map Map=newhashmap();
用于(文件类文件:我的库){
InputStream输入=新文件InputStream(类文件);
新建类读取器(输入).accept(新建MyClassVisitor(映射),0);
input.close();
}
对于(Map.Entry:Map.entrySet()){
if(entry.getValue()==0){
System.out.println(“未使用的方法:+entry.getKey());
}
}
享受吧!IntelliJ有一个工具可以检测方法、字段和类,这些方法、字段和类可以有更多限制的修饰符。它还有一个快速修复程序来应用这些更改,这也可以节省您大量的工作。如果您不想为此付费,您可以获得30天的eval许可证,这足够您更改代码,这不是您的专利应该经常做
顺便说一句:IntelliJ有大约650个代码检查来提高代码质量,大约一半有自动修复,所以我建议花几天时间使用它来重构/整理您的代码。请看一看。它声称可以做您想要做的事情:使用静态分析查找未使用的代码。代码覆盖工具的问题是ey在运行时工作,因此您可能会错过“罕见”的代码路径。听起来您希望像Cobertura或Emma这样的东西监视您正在运行的应用程序,而不是依赖一组单元测试覆盖率?如果方法a调用方法B,方法B将被标记为“已使用”,即使没有使用方法A,这也不是正确的计数方法。