我们正在使用Sonar来审核我们的代码库.对于未使用的私有方法,未使用的私有字段和未使用的本地变量,几乎没有违规.
根据我的理解,私有方法和私有字段只能通过反射和Java Native Interface在类外部访问.我们在代码库中没有使用JNI,而是在某些地方使用反射.
所以我们计划的是对这些方法和字段进行完整的工作区搜索,如果这些方法和字段在任何地方都没有使用,那么这些将被注释掉.再次通过反射访问私有方法和字段的机会非常少.这是为了更安全的一面.
无法在方法之外访问未使用的局部变量.所以我们可以评论出这些.
你对此有什么其他建议吗?
解决方法:
我喜欢自己反思,但用几句话说:它可能是一场噩梦.将java反射保持在一个非常可控的(即无状态,无全局/外部变量用法)和最小范围.
要找什么?
要查找公开的私有字段和方法,请查找Field#setAccessible()
and Method#setAccessible()
,例如以下示例:
Field privateNameField = Person.class.getDeclaredField("name");
privateNameField.setAccessible(true);
Method privatePersonMethod = Person.class.getDeclaredMethod("personMeth", null);
privatePersonMethod.setAccessible(true);
所以,setAccessible()会让你有些冒烟,但getDeclaredField()和getDeclaredMethod()实际上是访问字段的地方(真正引起火灾的地方).
要特别注意它们中使用的值,特别是如果它们是变量(它们可能是变量),因为它们决定了所访问的字段.
做纯文本搜索
此外,在整个项目文件夹中对字段/方法名称进行纯文本搜索非常有用.我会说,如果你不确定,在进行全文搜索之前不要删除.
如果你还有很多其他依赖于这个项目的项目你正试图改变;如果你不是(或者不知道)种植那些(炸弹)的人,我会放手.只有真正需要改变才会改变.当您需要对其周围的代码进行更改时,最好的方法是逐个获取它们.
啊,如果你有它们,运行代码覆盖率的测试也可以帮助你发现未使用的代码.