如何从原始类文件中找出依赖类?

时间:2014-03-21 09:37:57

标签: java class jvm .class-file language-specifications

当我查看binary class file时,我可以轻松找到需要加载的其他类以便使用此类吗?

作为一种“目录”,我只能看到带类条目的常量池表 。第1和第2个条目具有特定含义,直接在我发现的and elsewhere的JVM规范中进行了解释。但是该表中的其他条目此类文件使用的其他类的列表?那么说import - *.java - {{1}}部分的JVM变体?

所以归结为:

  • 常量池表中的所有类条目是否引用类文件中在某处使用的
  • 其他机制如何将类条目引入常量池
  • 假设我不想在第一次使用类时实现某种“惰性类加载”,那么我是否通过使用类条目加载已使用类的正确列表 常量池表
  • 中的

3 个答案:

答案 0 :(得分:2)

  

常量池表中的所有类条目都是指一个类   在类文件的某处使用?

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

  

或者是否有其他机制如何进入类条目   恒定的游泳池?

不,常量池是固定的。虽然磁盘上的文件可能不代表加载的实际类,但由于自定义类加载器或Java代理始终可以在运行时操作事物。

  

假设我不想实施某种类型的懒惰课程   装载"在第一次使用一个类时,我正在加载正确的   通过使用常量池中的类条目使用的类的列表   表

对于静态分析,这是您能做的最好的事情。请注意,您将错过通过反射使用的依赖项,但您无法做到这一点。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

jdeps是一个非常强大的工具(自java 8起),它将向您展示所有依赖项。它遍历给定的Folder,class或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/]

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