我正在编写一个基于OpcodeStackDetector的Findbugs探测器,它使用如下签名查看对Java方法的所有调用:
void foo(Object...args)
如果其中一个args属于Throwable类型或其任何后代,它应报告错误。
如何获取表示参数的方法调用的引用列表,然后确定每个参数的Class是否是java.lang.Throwable的子类型?
答案 0 :(得分:0)
我可以看到OpcodeStackDetector累积了堆栈,所以当你在detect中看到一个方法调用操作(INVOKEVIRTUAL,INVOKESPECIAL等之一......)时,堆栈的顶部应该包含对象数组的引用
Findbugs包含用于理解字节代码的ASM和BCEL库,因此应该可以从引用桥接到内存中的实际数组,并以某种方式从数组中获取对象引用列表。从那里,您可以使用ASM / BCEL来验证每个参考的类型。
你怎么做也让我感到困惑。