我运行以下代码来获取.class文件中的异常处理程序:
public void getException(SootMethod method){
DavaBody db = (DavaBody) method.retrieveActiveBody();
IterableSet excepFacts = db.get_ExceptionFacts();
Iterator<ExceptionNode> it = excepFacts.iterator();
while(it.hasNext()){
ExceptionNode en = it.next();
...
}
}
运行上面的代码后出现错误:
Exception in thread "main" java.lang.ClassCastException:
soot.jimple.JimpleBody cannot be cast to soot.dava.DavaBody
该方法method.retrieveActiveBody()
返回 Body 类型,而不是 JimpleBody,那么为什么会发生此错误?
根据文档,public Body retrieveActiveBody()
是:
返回活动主体(如果存在),否则构造活动主体并返回该主体。
让我们看一下Body
类:
public abstract class Body
extends AbstractHost
implements Serializable
所以它是Abstract
类,根据你的例外,它返回JimpleBody
,Body
的子类。
如果Rabbit
是Animal
的,并且Wolf
也是Animal
的,Rabbit
不是Wolf
。
您可以像这样编辑代码:
if (method.retrieveActiveBody() instanceof JimpleBody) {
} else if (method.retrieveActiveBody() instanceof DavaBody) {
} else if (method.retrieveActiveBody() instanceof BafBody) {
} else if (method.retrieveActiveBody() instanceof StmtBody) {
} else {
}
Body 是声明的类型。在你的烟灰配置中,它实际上返回了一个JimpleBody。