2011-04-17 53 views
2

我发现,似乎有2级通用的解决方案:如果代码将被模糊处理,我总是可以使用Reflection API吗?

  1. 不要混淆什么是通过反射API简称[RetroguardJobfuscate]
  2. 与混淆的名称反射API调用替换字符串。

这些解决方案仅适用于同一项目内的调用 - 客户端代码(在另一个项目中)可能不使用反射API访问非公共API方法。

在2的情况下,它也只适用于反射API与编译时已知的字符串(私有方法测试?)一起使用。在这些情况下,dp4j也提供了在混淆之后注入反射代码的解决方案。

阅读Proguard FAQ我想,如果2;否则,始终当它说的工作:

的ProGuard会自动处理 结构,如 的Class.forName( “SomeClass的”)和 SomeClass.class。引用的 类保留在缩小的 阶段中,并且在混淆 阶段正确替换了字符串参数 。

对于可变字符串参数,通常不可能确定其可能的值为 。

问:粗体语句是什么意思?任何例子?

回答

2

对于可变字符串参数,通常不可能确定它们的可能值。

public Class loadIt(String clsName) throws ClassNotFoundException { 
    return Class.forName(clsName); 
} 

基本上,如果你传递一个非字符串常量的Class.forName,一般没有办法的ProGuard或任何混淆工具来找出你在说什么类,因此无法自动调整代码为你。

+0

好的,也就是说,在编译时或者这种情况的一个子集(即编译器无法找到它)时,字符串是未知的。 – simpatico 2011-04-17 07:46:56

+0

正确。事实上,上述样本在理论上可能意味着通过反射加载的100个类。 – MeBigFatGuy 2011-04-17 08:00:43

1

这意味着,这样的:

String className; 
if (Math.random() <= 0.5) className = "ca.simpatico.Foo"; 
else className = "ca.simpatico.Bar"; 
Class cl = Class.forName(className); 

不会混淆后工作。 ProGuard没有进行足够深入的数据流分析来查看被加载的类名来自这两个字符串文字。

真的,你唯一合理的选择是决定应该通过反射访问哪些类,接口和方法,然后不要混淆这些。您正在为客户有效地定义一种奇怪的API - 只能以反射方式访问。

相关问题