1

我有一个 *.jar 文件,我想使用其中的一些类。其中,它包含来自包“com.aa”的类“a”和具有类“a”的包“com.aaaae”。当我尝试以“com.aaaaea”的身份访问类时,出现错误:com.aaaa 无法解析为类型。发生这种情况是因为编译器试图获取类“com.aaa”的字段“a”而不是包“com.aaaa”。我也尝试导入此类,但没有区别,我收到错误“无法解析导入 com.aaaa”。

有没有办法使用“com.aaaaea”类?是否有任何工具可以重命名 *.jar 中的类?或者可能是反思可以帮助这里?

4

3 回答 3

3

您尝试使用的 JAR 很可能已被混淆,可能是为了阻止您尝试执行的操作。一些 Java 混淆器更改包、类、方法和变量名称以违反 JLS,但仍然是有效的编译字节码;这似乎正是对这个 JAR 所做的。在这种情况下,很难理解反编译的代码。

被混淆的 JAR 通常只保留其公共 API 未混淆供您的代码使用;其他所有内容都被打乱以防止您反编译和/或直接使用它。

于 2012-11-05T15:41:39.993 回答
2

来自 JLS 的引述:

简单名称可能出现在可能被解释为变量、类型或包的名称的上下文中。在这些情况下,§6.5 的规则指定将优先选择变量而不是类型,并且将优先选择类型而不是包。因此,有时可能无法通过其简单名称来引用可见类型或包声明。我们说这样的声明是模糊的。

反思可以帮助解决这个问题。尽管在大多数情况下重命名类也是一种解决方案,但表现良好的 jar 甚至不应该有这个问题。我怀疑你的 jar 已经经过了混淆过程,这取决于它是如何完成的,这会使重命名类变得复杂。

于 2012-11-05T13:51:26.470 回答
0

使用 Java 代码约定 - http://www.oracle.com/technetwork/java/codeconv-138413.html - 你永远不会有这样的错误。

如果你想访问 jar - 反编译它,修复它并重新组装它。

于 2012-11-05T13:48:03.523 回答