我想这种情况开始时非常罕见,因此我承认它可能过于本地化了。
public class bqf implements azj
{
...
public static float b = 0.0F;
...
public void b(...)
{
...
/* b, in both references below,
* is meant to be a class (in the
* default package)
*
* It is being obscured by field
* b on the right side of the
* expression.
*/
b var13 = b.a(var9, var2, new br());
...
}
}
错误是: cannot invoke a(aji, String, br) on primitive type float
。
可妥协的限制:
我正在修改一个混淆程序。对于不相关的[?],未知(对我来说)和不可妥协的原因,必须通过使用.class文件修补原始jar来完成修改。因此,重命名公共字段b或类b将需要修改大部分程序。因为所有类都在默认包中,所以重构类b将要求我修改引用b的每个类(大部分程序)。尽管如此,我还是打算进行大量修改,在字节码级别进行修改是很痛苦的。仅仅不足以保证重命名/重构。
最明显的一个是重命名/重构。有数千个类,每个类都在默认包中。似乎我想要修改的每个java程序都有这种混淆。 :(
无论如何,有时我会花时间去手动重命名/重构程序。但是当错误太多时(我曾经做过18,000次),这不是一个可行的选择。
第二个显而易见的选择是在字节码中进行(通过ASM)。当修改很小或很简单时,有时这是可以的。不幸的是,只对那些我无法通过java编译的文件进行字节码修改(这是我们通常尝试做的大部分,但这是我通常尝试做的事情)。相比之下,这是非常缓慢的。
有时我可以扩展类b,并在我修改过的类中使用它。显然,这并不总是有效,例如当b是枚举时。不幸的是,这意味着很多额外的课程。
可以使用静态包装器方法创建一个类以避免模糊。我只想到了这一点。
重新映射所有名称的工具(不是反混淆,只是唯一的名称),然后在您进行修改后取消映射它们。那会很好。如果它不存在,我应该制作一个。
问题也可以通过强制java编译器要求关键字“this”来解决。
答案 0 :(得分:2)
b.a(var9, var2, new br());
可以使用反射轻松重写:
Class.forName("b").getMethod("a", argTypes...).invoke(null, var9, var2, new br());
这个问题也可以通过一种方法来解决,迫使java编译器需要关键字"这个"。
我不会想到这会对静态成员有什么帮助。编译器必须要求我们限定所有内容 - 基本上不允许使用简单名称,除了本地人。
答案 1 :(得分:1)
在其他地方编写一个调用b.a()的辅助方法。然后你可以调用它。
注意:在Java中,惯例是类将命名为B
而不是b
(也适用于bqf和aqz)并且如果已遵循问题不会显示出来。
真正的长期治疗方法不是将类放入默认包中。