访问与* .jar中的类同名的包

时间:2012-11-05 13:45:01

标签: java deobfuscation

我有一个* .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中的类?或者反思可以帮到这里吗?

3 个答案:

答案 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 - 反编译它,修复它并将它组装回来。