我需要提供一个报告,说明我们的代码使用了哪些API,以及确切调用哪些方法。对于Windows DLL,我会使用“dumpbin / imports” - 是否有Java .class文件的等价物?
javap似乎是一个显而易见的地方,但我找不到任何似乎做我想要的选择。
答案 0 :(得分:2)
javap -c class1 class2 ... | grep invoke
您将获得所有运行时调用。您应该从API中过滤它们,然后调用导入的方法。
您可能还想确定使用过的导入字段:
javap -c class1 class2 ... | grep getstatic
(也搜索putstatic,putfield,getfield)
答案 1 :(得分:1)
这很残酷,但你可以尝试这样的事情:
在代码中进行全局搜索/替换“导入” x.y.Z“与静态类Z {}在哪里 包x.y来自您的第三方
jar运行编译脚本(如果可能,从IDE复制错误)
处理寻找的编译错误
“The method xxx is undefined
”类型
消息
答案 2 :(得分:0)
Apache / Maven jxr怎么样?
答案 3 :(得分:0)
我不知道这样做的具体工具,但在我看来,如果您有jar或源,可以使用perl脚本以适度的难度完成。
您可以通过jad http://en.wikipedia.org/wiki/JAD_(JAva_Decompiler)运行jar来生成源代码,然后编写一个perl脚本:
扫描源的每个文件
一个。找到所有导入reg表达式字符串
b查找与导入的匹配的反编译第三方源中的所有源文件 封装
℃。对于第三方中的每个文件,提取方法名称
d。如果匹配,请保存方法+ class + package。
这当然可以更高效 - 您可以创建所有包的哈希表,并在其中创建第三方所有方法的哈希表。
使用方法后,您可以从表中删除它,因为您不需要再次查找它。
但是可能蛮力方法已经足够了,因为这不是一个计算密集型问题(当然对于人类而言,它会非常耗费人力!)。
如果这是你的偏好,用perl代替ruby / python / php / sed / awk。
答案 4 :(得分:0)
如果你想要很多力量和灵活性,我肯定会看看ASM library
基本上有很多很棒的工具可用于分析和操作java字节码。您可能发现最有用的一个是基于vistor的API,它可以遍历任何类的内部并执行您想要的任何分析(在您的情况下检测哪些其他类/包被引用)。