我运行以下代码来获取.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()返回主体类型,而不是JimpleBody,那么为什么会发生此错误?

最佳答案

documentation中,public Body retrieveActiveBody()为:


  返回活动主体(如果存在),否则构造一个活动主体并将其返回。


让我们看一下Body类:

public abstract class Body
extends AbstractHost
implements Serializable


因此它是Abstract类,并且根据您的异常,它返回JimpleBody,它是Body的子类。

如果RabbitAnimal,并且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 {

}

关于java - 烟尘:soot.jimple.JimpleBody无法转换为soot.dava.DavaBody,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53862112/

10-16 21:28