如何确定Java类使用哪些方法

时间:2010-05-13 22:19:59

标签: java class import

我需要提供一个报告,说明我们的代码使用了哪些API,以及确切调用哪些方法。对于Windows DLL,我会使用“dumpbin / imports” - 是否有Java .class文件的等价物?

javap似乎是一个显而易见的地方,但我找不到任何似乎做我想要的选择。

5 个答案:

答案 0 :(得分:2)

javap -c class1 class2 ... | grep invoke

您将获得所有运行时调用。您应该从API中过滤它们,然后调用导入的方法。

您可能还想确定使用过的导入字段:

javap -c class1 class2 ... | grep getstatic(也搜索putstatic,putfield,getfield)

答案 1 :(得分:1)

这很残酷,但你可以尝试这样的事情:

  1. 在代码中进行全局搜索/替换“导入” x.y.Z“与静态类Z {}在哪里 包x.y来自您的第三方

  2. jar运行编译脚本(如果可能,从IDE复制错误)

  3. 处理寻找的编译错误 “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脚本:

  1. 扫描源的每个文件

    一个。找到所有导入reg表达式字符串

    b查找与导入的匹配的反编译第三方源中的所有源文件    封装

    ℃。对于第三方中的每个文件,提取方法名称

    d。如果匹配,请保存方法+ class + package。

  2. 这当然可以更高效 - 您可以创建所有包的哈希表,并在其中创建第三方所有方法的哈希表。

    使用方法后,您可以从表中删除它,因为您不需要再次查找它。

    但是可能蛮力方法已经足够了,因为这不是一个计算密集型问题(当然对于人类而言,它会非常耗费人力!)。

    如果这是你的偏好,用perl代替ruby / python / php / sed / awk。

答案 4 :(得分:0)

如果你想要很多力量和灵活性,我肯定会看看ASM library

基本上有很多很棒的工具可用于分析和操作java字节码。您可能发现最有用的一个是基于vistor的API,它可以遍历任何类的内部并执行您想要的任何分析(在您的情况下检测哪些其他类/包被引用)。