Java从字节码中收集所有使用过的类

时间:2014-03-05 11:41:29

标签: java class bytecode collect

我尝试实现RemoteClassLoader,它复制并加载将在运行时使用的所有类。首先,我需要收集使用过的类,我找到了一个解决方案:

Find out which classes of a given API are used

但这并不是一个需要,它只收集“可见”类的用法,就像加载类并迭代所有声明的字段和方法,以及收集所有类型一样。 我有一个只包含静态方法的类,没有使用此方法的实例,因此它将永远不会被赋予函数或将是一个字段,因此我无法看到该类。

当然,字节码文件包含此类的名称:

strings TestClass.class | grep -i "json"

gives: org/json/JSONObject

是的,我上课,不喜欢。 我该怎么找到它?而其他我只在功能中使用。

1 个答案:

答案 0 :(得分:0)

最简单但最保守的方法是简单地从常量池中获取所有Class_info条目。为了调用方法或访问类的字段,该类必须有一个常量池条目(不计算反射,也不计算子类中的重写方法)。

有许多工具可以解析类文件并让您访问它。反思当然要困难得多,而且一般都是不可判断的。

编辑:这不包括类型描述符,它们只是Utf8_info个。如果您想查找用作类型的类,有两种方法。您可以浏览所有Utf8并包含看起来像描述符的所有内容(在极少数情况下可能有误报),或者您可以浏览类文件并查找所有类型描述符引用。