使用反射来进行私有方法的单元测试,如果使用混淆,为什么会失败?

3
我曾经阅读了关于单元测试私有方法和字段的问题的这个SO问题这个答案说可以通过反射机制实现。但是有一条评论说如果进行混淆会失败。为什么会这样?
2个回答

6

混淆通过替换符号名称(方法、字段等)为难以阅读的名称来实现。因此,在反编译后,你会得到一个Java文件,但是这个Java代码是无用的。

方法名已经改变了,所以使用反射查找将不起作用(除非测试代码使用了混淆的方法名-这不是一项容易的工作)


所以在反编译后,你会得到一些Java文件,但是这些文件包含的Java代码是非常无用的。请问一下,当代码被编译时,我们是编译混淆过的代码还是未经混淆的代码呢? - Geek
@Geek - 他的意思是原始方法名称已被替换为诸如“a”、“b”、“c”等名称……如果您试图阅读代码,这是“非常无用”的。 - Stephen C
@StephenC 但是无论混淆器给出什么名称,我们仍然知道这些名称,对吧? - Geek
1
不一定。对代码进行小改动,重新运行混淆器,混淆后的名称可能都会不同。此外,您是否想手动映射大量单元测试类中的原始方法名称字符串到它们的混淆等效项?您是否想维护两组单元测试,一组使用原始名称,另一组使用混淆名称? - Stephen C

4
混淆可以将私有方法重命名为任何它想要的(无法对公共方法这样做,因为其他包可能会依赖它)。
反射的危险在于您拥有表示方法名称的字符串;混淆器无法检测到该字符串引用了私有方法,因此可以自由地对方法进行重命名。

当代码被编译时,它会在混淆之后被编译对吧?因此,我们可以根据私有修饰符知道私有方法的名称。我在这里漏掉了什么? - Geek
不,大多数混淆软件都是在已编译的字节码上运作。代码会被编译后,再由混淆器重命名内部符号(等等)。 - Jeff Foster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接