编写一个 findbugs 检测器,该检测器知道方法参数是否属于 Throwable 类型



我正在编写一个基于OpcodeStackDetector的Findbugs检测器,它查看所有对Java方法的调用

,签名如下:
void foo(Object...args)

如果其中一个参数的类型是 Throwable 或其任何后代,它应该报告一个错误。

如何获取表示参数的方法调用的引用列表,然后确定每个参数的类是否是 java.lang.Throwable 的子类型?

我可以看到OpcodeStackDetector会累积堆栈,因此当您在检测中看到方法调用操作(INVOKEVIRTUAL,INVOKESPECIAL等之一)时,堆栈的顶部应该包含对对象数组的引用。

Findbugs 包括用于理解字节码的 ASM 和 BCEL 库,因此应该可以从引用桥接到内存中的实际数组,并以某种方式从数组中获取对象引用列表。从那里,您可以使用 ASM/BCEL 来验证每个引用的类型。

你怎么做也让我感到困惑。

最新更新