首页 > 解决方案 > 一旦触发 main(),如何找到所有被调用的类?

问题描述

我试图找到main()我所拥有的项目中涉及的每一门课程。我们同时使用JavaGroovywith gradle。这个项目包括许多不同的 jars,它们使用许多不同的main()方法进行编译。我们正试图拆散这个庞大的项目并将它们全部移动到单独的git存储库中。目前我们SVN与 Eclipse IDE 一起使用,并且正在转向gitIntelliJ。

如何找到与我的main()方法交互的每个类,以便我可以一次复制/提取/剪切它们,或者以类似的方式?那个和唯一接触这个类的main()类。我们只想从这一庞大的项目组中删除这个项目。

例子:

public static void main(String args[]) {
  AClass.init();
  BClass.init();
  CClass.init();
  DClass.init();
}
...
public class AClass {
  //calls a number of classes
}
...
public class ABlass {
  //calls 15 other classes
}
...etc

我想知道每个main()调用、AClass调用、BClass调用的类,以及在所有其他类中调用其他类的类,这些类与main(). 这可能吗?我可以使用EclipseIntelliJ帮助我搜索它们。

标签: javagroovy

解决方案


由于反射,几乎不可能让它完美。当您的应用程序运行时,可以加载更多类。但是您可以尝试添加-verbose:class到您的启动命令并将其发送到文件并解析结果。这将列出所有加载的类。

您将添加-verbos:class到运行应用程序的任何位置。下面的屏幕截图在 IntelliJ 中,但无论您在何处运行java命令,您都可以执行相同的操作。命令行或 IDE。

这会给你这样的输出(很多)。这将比您可能想要的要多得多,但您可以解析它以根据包找到您要查找的内容。

[Loaded java.io.StreamCorruptedException from /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre/lib/rt.jar]
[Loaded org.entando.entando.aps.system.init.model.AbstractReport from file:/projects/entando/entando-core/engine/target/classes/]
[Loaded org.entando.entando.aps.system.init.model.DataSourceInstallationReport from file:/projects/entando/entando-core/engine/target/classes/]
[Loaded org.springframework.core.convert.support.StringToEnumConverterFactory$StringToEnum from file:/Users/josephwhite/.m2/repository/org/springframework/spring-core/5.1.8.RELEASE/spring-core-5.1.8.RELEASE.jar]
[Loaded org.springframework.core.convert.support.ConversionUtils$$Lambda$69/2073333566 from org.springframework.core.convert.support.ConversionUtils]
[Loaded org.springframework.core.NestedExceptionUtils from file:/Users/josephwhite/.m2/repository/org/springframework/spring-core/5.1.8.RELEASE/spring-core-5.1.8.RELEASE.jar]
[Loaded org.entando.entando.aps.system.init.model.InvalidPostProcessResultException from file:/projects/entando/entando-core/engine/target/classes/]
[Loaded org.entando.entando.aps.system.init.model.IPostProcess from file:/projects/entando/entando-core/engine/target/classes/]
[Loaded org.entando.entando.aps.system.init.model.SelfRestCallPostProcess from file:/projects/entando/entando-core/engine/target/classes/]
[Loaded javax.ws.rs.core.Response$StatusType from file:/Users/josephwhite/.m2/repository/javax/ws/rs/javax.ws.rs-api/2.0.1/javax.ws.rs-api-2.0.1.jar]
[Loaded javax.ws.rs.core.Response$Status from file:/Users/josephwhite/.m2/repository/javax/ws/rs/javax.ws.rs-api/2.0.1/javax.ws.rs-api-2.0.1.jar]
[Loaded org.entando.entando.aps.system.services.api.model.ApiMethod from file:/projects/entando/entando-core/engine/target/classes/]
[Loaded org.entando.entando.aps.system.init.cache.IInitializerManagerCacheWrapper from file:/projects/entando/entando-core/engine/target/classes/]
[Loaded org.entando.entando.aps.system.init.model.SystemInstallationReport$Status from file:/projects/entando/entando-core/engine/target/classes/]
[Loaded com.agiletec.aps.system.common.AbstractCacheWrapper from file:/projects/entando/entando-core/engine/target/classes/]
[Loaded org.entando.entando.aps.system.init.cache.InitializerManagerCacheWrapper from file:/projects/entando/entando-core/engine/target/classes/]

但是,您可能会在这里仔细考虑您的方法。最好是创建新项目,将前几个类移过来,然后随时修复编译错误。您将更好地了解事物是如何连接在一起的,即使它有数百个类,它也可能是值得的。

这是 IntelliJ 中的一个示例在此处输入图像描述


推荐阅读