我运行了以下代码来获取.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,那么为什么会发生此错误?
发布于 2019-01-04 13:25:57
根据文档,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 {
}发布于 2019-01-04 10:17:27
主体是声明的类型。在您的碳烟配置中,它实际上返回一个JimpleBody。
https://stackoverflow.com/questions/53862112
复制相似问题