gpt4 book ai didi

java - 从 Java 程序中获取任何类的源代码

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:19 24 4
gpt4 key购买 nike

我正在尝试从 Java 程序中检索任何类(如果可用)的源代码以进行调试。假设我有 Class[_] 的引用,我想检索它的源代码。

到目前为止我在 Scala 中的尝试:

val clazz = classOf[ClassDefinedInSeparateFile]

  1. clazz.getProtectionDomain.getCodeSource.getLocation.toString + "/"+
    clazz.getPackage.getName.replaceAll("\\.","/") + "/"+ clazz.getSimpleName + ".scala"
    - 看起来不错,JAR 在那里并且包含 。 scala 文件,但无法使用 Source.fromFile(...) 打开。
  2. "/"+ clazz.getPackage.getName.replaceAll("\\.","/") + "/"+ clazz.getSimpleName + ".scala" - 看起来不错,但是无法使用 Source.fromInputStream(...)
  3. 打开

备注:

  • 在生产或暂存环境中没有可用的 IDE。
  • 在我们的设置中,JAR 包含源代码 .java.scala 文件,因此不需要反编译器。 (至少对于应用程序的源代码而言,但不是依赖项。如果可以访问应用程序源代码的片段,那就足够了 - 大多数异常都在应用程序级别捕获并与那里相关。)

谢谢。

最佳答案

如果源在类路径中的 jar 中,您需要找出它的确切位置。

clazz.getName.replaceAll("\\.", "/") + ".scala" 是一个不错的猜测,但是:(1) 源代码可能与类不在同一个地方 - 可能有一个前缀(如 src/ 或其他),或者它甚至可能在不同的 jar 中,并且(2)scala 类没有在具有相同名称的文件中 - 你可以在一个文件中有多个类,该文件可以称为 foo.scala,一些类是动态生成的等。此外,一个包并不总是scala 中的一个目录(例如它可以是一个包对象)。

如果您知道 jar 中的位置(并且 jar 在类路径中),打开它的方法是:clazz.getClassLoader.getResourceAsStream ... 但是,就像我上面说的,诀窍是找出位置。这并不容易(并且没有单一的标准方法来做到这一点)。

您最好的选择确实是使用 IDE。我知道您在生产环境中没有它,但您并不真正需要它。您需要的是在您拥有 IDE 的机器上可用的生产源代码,并且您可以使用简单的 scp 命令实现。

关于java - 从 Java 程序中获取任何类的源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53749060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com