“J2EE 最佳实践”代码复审仅由一个类别组成;它也被称为“J2EE 最佳实践”。
代码复审中的某些规则要求数据流分析检测出某些发现结果。数据流分析会跟踪发现结果的路径。因此,当应用了那些规则时,将需要花费更长的时间来完成代码复审。
下表列出了“J2EE 最佳实践”代码复审中的所有类别和子类别,以及每个类别和子类别中的规则的描述。在左列中,类别使用粗体文本,子类别使用纯文本。
类别或子类别 | 描述 |
---|---|
J2EE 最佳实践 | 包含的规则基于最佳 J2EE 开发实践并且支持针对 WebSphere 服务器的 Web 项目 |
正确性 | 包含的规则用于检测不正确的方法调用 |
数据竞争 | 包含的规则用于检测可在 J2EE 应用程序中引起数据竞争状态的方法调用 |
垃圾回收 | 包含的规则用于检测可以延迟垃圾回收的方法调用 |
可维护性 | 包含的规则用于检测在 J2EE 应用程序中可能很难维护的代码 |
性能和可伸缩性 | 包含的规则用于检测防碍 J2EE 应用程序性能或限制 J2EE 应用程序可伸缩性的方法调用 |
资源管理 | 包含在 J2EE 应用程序中使用资源的 J2EE 最佳实践规则 |
“J2EE 最佳实践”代码复审应用的规则有两种类型:快速规则和深层规则。区分规则类型的特征是应用规则的时间长短和规则在发现结果中给出的信息类型。
快速 J2EE 规则
在“J2EE 最佳实践”代码复审中应用快速 J2EE 规则比应用深层规则所花的时间要少。快速规则会给出与其它代码复审中的规则相同的发现结果信息。
深层 J2EE 规则
深层 J2EE 规则需要数据流分析,因此需要比快速规则更多的时间来生成发现结果。深层 J2EE 规则不仅产生发现结果,而且还显示通向发现结果的路径。这些规则需要数据流分析(即跟踪路径的方法),因此需要比快速规则更多的时间来生成发现结果。深层规则提供了以下补充信息:有 36 个深层 J2EE 规则。下表的左列列出了这些规则所属的子类别。右列列出或描述了子类别中哪些规则是深层 J2EE 规则。
类别或子类别 | 深层 J2EE 规则 |
---|---|
正确性 | 避免在 javax.servlet.http.HttpSession 中存储不实现 java.io.Serializable 的对象 |
数据竞争 | 避免不使用共享锁定而从 javax.servlet.Service.service() 为任何静态字段赋值 避免不使用共享锁定而从 javax.servlet.Service.service() 为 servlet 实例字段赋值 |
性能和可伸缩性 | 始终在 javax.servlet.http.HttpServletRequest.getSession() 之后调用 javax.servlet.http.HttpSession.invalidate() |
资源管理 | 此子类别中的 32 个规则全部都是深层 J2EE 规则。 |
本部分包含在“J2EE 最佳实践”代码复审中应用的每个规则类型的一个样本。
样本快速规则
以下规则是“性能和可伸缩性”子类别中的样本快速规则。
避免从任何 servlet 调用 java.lang.Runtime
样本深层规则
始终在 new java.io.FileInputStream(java.io.File) 之后调用 java.io.FileInputStream.close()
本部分记录“J2EE 最佳实践”代码复审的已知问题。
假警报:输入流未结束
摘要:“J2EE 最佳实践”代码复审生成一个输入流未结束的发现结果。事实上,没有其它输入流要结束。
public static int readFirstByte(String fileName) { int firstByte = -1; FileInputStream fis=null; BufferedInputStream bis = null; try { fis = new FileInputStream(fileName); bis = new BufferedInputStream(fis); firstByte = bis.read(); } catch (FileNotFoundException fnfe) { LogUtility.log(fnfe); } catch (IOException ioe) { LogUtility.log(ioe); } finally { if (bis!=null){ try { bis.close(); } catch (IOException ioe){ LogUtility.log(ioe); } } } return firstByte; }
变通方法:右键单击作为假警报的发现结果,然后单击忽略。
信息不足:针对某个 .classpath 文件报告了发现结果
摘要:“J2EE 最佳实践”代码复审针对 .classpath 文件(而不是针对工作台中资源)生成了发现结果。
描述:代码复审找到了一个二进制类型的问题,并且该类型在工作台中没有相应的资源,因为它被包含在外部的 JAR 中。
引用:RFE RATLC00038795
变通方法:
资源过滤器:对深层规则不起作用
摘要:在“资源过滤器”页面上,您指定不想在代码复审期间应用选定深层规则的文件。但是,过滤器不起作用,并且规则仍应用于您指定的文件。
描述:当涉及指定不想在代码复审期间应用规则的文件时,深层 J2EE 规则的作用方式不同。深层规则不能识别“资源过滤器”页面上指定的文件,但是能识别出“排除”页面上的文件(缺省情况下该页面上列出 JAR 文件)。这些规则识别两种要排除的文件类型:标准的 servlet 或 JAR 文件,并且忽略所有其它类型。