烟灰:soot.jimple.JimpleBody 不能被铸造到烟灰.dava.DavaBody



我运行以下代码来获取.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类,根据你的例外,它返回JimpleBodyBody的子类。

如果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 {
}

Body 是声明的类型。在你的烟灰配置中,它实际上返回了一个JimpleBody。

相关内容

  • 没有找到相关文章

最新更新