当前位置: 首页 > 知识库问答 >
问题:

从编译后的类中推断公开可用的Java代码的版本

仲霍英
2023-03-14

我目前正在使用一个旧的JavaSE项目,它有一些SLF4J版本作为依赖项(例如参考org.slf4j. Logger),但是相关的类被打包在一个非常奇怪的JAR中,简称为commons.jar,我在互联网上找不到任何匹配的库,它们的内容与这个文件相匹配;有没有任何“智能”的方法来查找与这个JAR文件中找到的编译Java类文件相匹配的代码?文件本身没有任何类型的元数据——只有编译过的*. class文件:

commons.jar
├── apache
│   ├── commons 
│   ├── http
│   ├── log4j
├── slf4j

如上面的结构所示,JAR似乎不“属于”任何常见的分发商;尽管它包含术语apache、公共资源、log*和slf4j,但它似乎不是来自Apache公共资源或SLF4J。

目前,我能想到的最好的就是下载一堆SLF4J版本,提取它们,然后在org/slf4j/Logger上运行例如.class神秘JAR的文件和每个版本中的类似Logger.class文件,例如

cmp commons/org/slf4j/Logger.class slf4j-1.7.22/slf4j-api-1.7.22/org/slf4j/Logger.class

然而,这不仅涉及大量工作,而且我相信等效源代码的编译可能会略有不同,这取决于所讨论的JAR发行商所使用的确切编译器……这意味着它们在每个字节的基础上无法进行比较。我该如何以更智能的方式进行这种搜索?

共有2个答案

赵炯
2023-03-14

我会研究以下内容:

  • 字节码Java版本,为您提供有关库构建时间的线索
  • 反编译所有内容...也许你很幸运,找到了一些评论/版本常量,给你更多的线索
茅和玉
2023-03-14

如何反映所有公共和私有类及其成员,将它们放入字符串中,对字符串进行排序并为每个版本生成一个文本文件。

您将找到与神秘版本库相匹配的库的一个版本,或者找到一个较小的范围。

 类似资料:
  • 我们目前在Java8中编译了代码,但我们在Java11 VM上运行它。现在我们也在尝试将代码移动到Java11编译时。想知道在Java8中编译代码与在Java11中编译代码在性能方面是否有任何好处,因为两个编译器都会生成不同的类文件(字节码)?在效率方面,一个与另一个有何不同?

  • 我可能会对遗留项目进行一些交叉编译,并且在最近的JDK中我注意到,对于、和JVM参数,我们仅限于一些特定的版本。 如何获得这些参数的支持版本?

  • 问题内容: 有没有办法编译本机C或C ++代码并将其公开给Linux上的Swift?我可以看到像libdispatch这样的几个Apple库都是用纯C语言编写的,您只需导入即可在Swift中访问它们。 举个例子,假设我有两个文件,并且定义了名为的结构。有没有一种方法可以通过编写import语句来编译它们并在Swift中使用它们? 我试着写文件里面目录下,并且文件位于: 和运行。此产量错误: 我正在

  • 问题内容: 谁能解释相同的Java源代码最终如何编译成 二进制 不同的类文件? 问题来自以下情况: 我们有一个相当大的应用程序(800多个类),该应用程序已经分支,重组并重新集成到主干中。在重新集成之前,我们将主干合并到分支中,这是标准过程。 最终结果是一组包含分支源的目录和一组包含中继源的目录。使用“超越比较”,我们能够确定两组来源相同。但是,在编译时(使用IntelliJ v11中托管的mav

  • PHP代码的编译 PHP是解析型高级语言,事实上从Zend内核的角度来看PHP就是一个普通的C程序,它有main函数,我们写的PHP代码是这个程序的输入,然后经过内核的处理输出结果,内核将PHP代码"翻译"为C程序可识别的过程就是PHP的编译。 那么这个"翻译"过程具体都有哪些操作呢? C程序在编译时将一行行代码编译为机器码,每一个操作都认为是一条机器指令,这些指令写入到编译后的二进制程序中,执行

  • 问题内容: 命令可以运行已编译的Scala代码吗?如果是这样,我们为什么要使用排他命令? 问题答案: 如果您在类路径中包含了Scala的所有必要运行时库(scala-library.jar,scala-swing.jar …),则可以运行Scala生成的字节代码。scala命令自动执行此操作,并支持特定于Scala的命令行参数。