【问题标题】:How do I determine which methods are used by a Java class如何确定 Java 类使用了哪些方法
【发布时间】:2011-02-19 07:37:04
【问题描述】:

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

javap 似乎是显而易见的地方,但我找不到任何似乎可以满足我追求的选项。

【问题讨论】:

  • 您到底在寻找什么:- 您的代码使用了哪些第 3 方包/类/方法? - 哪些方法用于查找死代码?此外,请记住,如果您使用反射,此类分析可能并不详尽。请注意,在最简单的情况下,您可能只是在 grep 中查找 *.java 文件中的所有导入语句...
  • 我们的代码使用了哪些第三方包/类/方法。具体来说,我们正在向客户提供一个 .jar,他们想确切地知道它调用了哪些方法。只是 grepping 的 import 语句会告诉我们我们使用了哪些包,但他们想要每个方法的列表(在你问之前,不,我不知道为什么)。
  • 以防万一您试图以其他方式说服客户:那么如果某个库从另一个库调用某个方法...?或者,如果您自己的方法(调用某个库方法)从未被调用过怎么办?

标签: java class import


【解决方案1】:

javap -c class1 class2 ... | grep invoke

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

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

javap -c class1 class2 ... | grep getstatic(同时搜索 putstatic、putfield、getfield)

【讨论】:

  • 谢谢!我知道必须有 some 方式:-)
【解决方案2】:

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

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

  2. jar 运行您的编译脚本(或尽可能从您的 IDE 复制错误)

  3. 处理寻找的编译错误 “The method xxx is undefined”类型 消息数

【讨论】:

  • 如果变量与方法命名相同,我描述的方法可能会返回错误的结果,但这里描述的方法不会有这个缺点。如果您编写 perl/python/ruby/sed 脚本来执行此操作,我认为这不会如此残酷。 +1 以获得正确且可行的解决方案。
  • 感谢大家的建议。我希望它可能比这更简单——类似于 Windows 上的 dumpbin /exports 或 Linux 上的 nm -u。唉,唉,人生就是这样。再次感谢!
【解决方案3】:

Apache/Maven jxr怎么样?

【讨论】:

  • 我以前没有使用过 jxr,但是从文档中我可以看到它从我们的源代码生成 HTML,并且不会告诉我们任何关于它调用的 3rd 方方法的信息(参见上面的评论)?
  • 它作为一个 API。你可以调用它。
【解决方案4】:

我不知道执行此操作的特定工具,但在我看来,如果您有 jar 或源代码,使用 perl 脚本可以轻松完成。

你可以通过jadhttp://en.wikipedia.org/wiki/JAD_(JAva_Decompiler)运行jar来生成源码,然后写一个perl脚本:

  1. 扫描源文件的每个文件

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

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

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

    d。如果匹配,则保存方法+类+包。

这当然可以变得更加高效 - 您可以制作所有包的哈希表,并在其中制作第三方所有方法的哈希表。

一旦使用了一个方法,你可以从表中删除它,因为你不需要再次查找它。

但可能蛮力方法就足够了,因为这不是一个计算密集型问题(当然,对于人类来说,这将是非常劳动密集型的!)。

如果你喜欢的话,用 ruby​​/python/php/sed/awk 代替 perl。

【讨论】:

    【解决方案5】:

    如果你想要强大的功能和灵活性,我肯定会看看ASM library

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

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 2016-03-17
      • 2012-05-02
      • 2015-08-06
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      相关资源
      最近更新 更多