我们正在使用声纳来审查我们的代码库。未使用的私有方法、未使用的私有字段和未使用的局部变量的违规情况很少。
根据我的理解,私有方法和私有字段只能通过反射和 Java 本机接口在类外部访问。我们没有在代码库中使用 JNI,而是在某些地方使用反射。
所以我们计划是workspace对这些方法和字段进行完整的搜索,如果即使通过反射也没有在任何地方使用它们,那么这些将被注释掉。再次通过反射访问私有方法和字段的机会非常少。这是为了更安全的一面。
不能在方法之外访问未使用的局部变量。所以我们可以注释掉这些。
您对此还有其他建议吗?
我自己喜欢反思,但简而言之:这可能是一场噩梦。保持 java 反射非常可控(即无状态,无全局/外部变量使用)和最小范围。
要查找变为公共的私有字段和方法,请查找Field#setAccessible()和Method#setAccessible(),例如下面的示例:
Field privateNameField = Person.class.getDeclaredField("name");
privateNameField.setAccessible(true);
Method privatePersonMethod = Person.class.getDeclaredMethod("personMeth", null);
privatePersonMethod.setAccessible(true);
Run Code Online (Sandbox Code Playgroud)
所以,setAccessible()会给你一些烟雾,但是getDeclaredField()和getDeclaredMethod()是真正进入田野的地方(真正引起火灾的地方)。
请特别注意其中使用的值,特别是如果它们是变量(它们可能会是),因为它们决定了所访问的字段。
此外,在整个项目文件夹中对字段/方法名称进行纯文本搜索非常有用。我想说,如果您不确定,请不要在进行全文搜索之前删除。
如果您有许多其他项目依赖于这个项目,那么您正在尝试进行更改;如果你不是(或不知道)安放这些(炸弹)的人,我就会放手。只有在确实需要的情况下才会改变。最好的做法是当您需要更改它们周围的代码时,将它们一一获取。
啊,而且,如果你有它们,运行具有代码覆盖率的测试也可以帮助你大量发现未使用的代码。