1

当我查看二进制类文件时,我是否可以轻松找出需要加载哪些其他类才能使用该类?

作为一种“目录”,我只能看到带有类条目的常量池表。第一个和第二个条目有特定的含义,直接在我找到的 JVM Spec和其他地方进行了解释。但是该表中的其他条目是否是该类文件使用的其他类的列表?这么说 - 文件的 - 部分的 JVM 变体?import*.java

所以归结为:

  • 常量池表中的所有类条目是否都引用了文件中某处使用的类?
  • 或者是否有其他机制可以让 Class 条目进入常量池
  • 假设我不想在第一次使用类时实现某种“延迟类加载”,那么我是否通过使用常量池表的类条目来加载正确的已用类列表?
4

3 回答 3

2

常量池表中的所有类条目是否都引用了类文件中某处使用的类?

不,您始终可以放入实际未使用的常量池条目。使用标准编译器编译的类将仅包含实际使用的条目。

或者是否有其他机制可以让 Class 条目进入常量池?

不,常量池是固定的。尽管磁盘上的文件可能不代表实际加载的类,因为自定义类加载器或 Java 代理总是可以在运行时操作事物。

假设我不想在第一次使用类时实现某种“延迟类加载”,那么我是否通过使用常量池表中的类条目来加载正确的已用类列表?

对于静态分析,这是你能做的最好的。请注意,您将错过通过反射使用的依赖项,但对此您无能为力。

于 2014-03-21T14:57:44.297 回答
0

jdeps 是一个非常强大的工具(从 java 8 开始),它将向您显示所有依赖项。它遍历给定文件夹、类或 jar 文件中的类文件,并向您显示应用程序中的依赖关系。只需运行“ jdeps -verbose ”,它就会为您提供所需的信息,甚至可能更多。你可以在这里阅读一些关于它的信息:[ http://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html]和这里[ https://www.voxxed.com/blog /2014/12/jdeps-compact-profiles-java-modularity/]

(请原谅我的英语,但它不是我的第一语言)

于 2015-01-08T14:39:10.103 回答
0

在 Java 8 中,提供了 jdeps 命令行工具来分析类文件的依赖关系。

于 2014-03-21T09:41:40.260 回答