我有一个* .jar文件,我想从中使用一些类。在其他方面,它包含来自包“com.a.a”的类“a”和包含类“a”的包“com.a.a.a.a.e”。当我尝试以“com.a.a.a.a.e.a”访问该类时,出现错误:com.a.a.a.a无法解析为类型。它发生是因为编译器试图获得类“com.a.a.a”的字段“a”而不是包“com.a.a.a.a”。我也尝试导入这个类,但没有区别,我得到错误“导入com.a.a.a.a无法解决”。
有没有办法使用“com.a.a.a.a.e.a”这个类?是否有任何工具可以重命名* .jar中的类?或者反思可以帮到这里吗?
答案 0 :(得分:3)
您尝试使用的JAR很可能是obfuscated,可能是为了防止您尝试做的事情。一些Java混淆器改变了包,类,方法和变量名来违反JLS,但仍然是有效的编译字节码;这似乎正是对这个JAR所做的。在这种情况下很难理解解编译的代码。
经过混淆的JAR通常只会对其公共API进行非模糊处理,以供您的代码使用;其他所有内容都被扰乱,以防止您对其进行反编译和/或直接使用它。
答案 1 :(得分:2)
来自JLS的引用:
简单名称可能出现在可能存在的上下文中 解释为变量,类型或包的名称。在这些 在情况下,§6.5的规则指定将选择变量 优先于类型,并且将优先选择类型 一个包。因此,有时可能无法参考a 通过简单名称显示可见类型或包声明。我们这么说 这样的声明模糊不清。
反思可以帮助解决问题。虽然在大多数情况下重命名类也可以是一种解决方案,但是表现良好的罐子甚至不应该有这个问题。我怀疑你的jar已经过了一个混淆过程,根据它的工作方式,它会使重命名类变得复杂。
答案 2 :(得分:0)
使用Java代码约定 - http://www.oracle.com/technetwork/java/codeconv-138413.html - 您将永远不会遇到此类错误。
如果你想访问jar - 反编译它,修复它并将它组装回来。