【问题标题】:Get list of necessary classes for a class to load获取要加载的类的必要类列表
【发布时间】:2013-07-29 15:32:47
【问题描述】:

我想获取一个类的导入列表。由于编译器已将其删除,我想通过反射可以扫描类、方法、字段等,并收集类加载器加载类所需的类列表。是否有某种图书馆、教程或文章您可以指点我,以便我更好地理解如何做到这一点? (我知道有人问过类似的问题,但我找不到正确的答案,我很确定这应该是可能的)。我看到了一些示例,展示了如果您有资源,您可以如何做到这一点,但在我的场景中不一定是这种情况。

非常感谢!

【问题讨论】:

  • @Gamb:这不是重复的!我已经看过了,我知道您无法获得确切的进口清单。但是,理论上您应该能够使用反射收集您的类使用的所有类的列表。我正在寻找这样的图书馆。
  • 您需要查看原始字节码。您的班级可能需要一个需要另一个班级的班级。您必须继续这样做,直到您的课程用完为止。注意:这可能比您需要的要多,因为一个类可能不需要另一个类,因为它引用了它。此外,一个类可能需要通过反射另一个类。
  • @carlspring 你在想什么理论?反射无法找出实际调用了哪些方法。您可以尝试执行所有代码并查看堆栈跟踪,但您可能会错过一些执行路径。
  • @SotiriosDelimanolis:执行代码只会给你一个一个异常,而不是所有缺失的类。

标签: java reflection import


【解决方案1】:

不,反思无济于事

void test() {
    Date date = new Date();
}

您无法检测到 Date 在反射方法内部使用。但是你可以使用Javassist https://github.com/jboss-javassist/javassist

    ClassPool cp = ClassPool.getDefault();
    Collection classes = cp.get("test.Test").getRefClasses();

此代码生成 test.Test 类中引用的所有类的名称的集合

【讨论】:

  • 那里!那是多么复杂啊! :) 非常感谢!
  • 如果给定的类不在类路径上,这是否也有效?
  • 这里有 cp.makeClass(InputStream classFile)
  • 好吧,我明白了……现在我想我可以做我需要做的了。非常感谢您的帮助!
  • 没有区别。编译后,.class 中没有导入,只有完整的类名
【解决方案2】:

我认为这不可能,除非通过读取源 .java 文件本身。我相当确定 Java 只是在编译期间使用列表进行扫描然后将其丢弃。

不过,Spring 会做这样的事情,并且有一个 google 项目可以扫描包中的注释等(忘记名称——类路径?)。

我建议你研究一下 Spring,它很可能完全符合你的要求,而且做得更多,而且下一个程序员会自动理解(如果他们知道 Spring)。

【讨论】:

  • IoC 并不是我想要的,但你确实是对的,Spring 似乎在做一些类似的魔法。
  • Spring 不再只是 IoC,它使面向方面的 java 更易于访问。它可以扫描和实例化包,并允许您在调用方法之前和之后做一些事情等。
猜你喜欢
  • 2011-04-22
  • 2019-03-23
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多