Soot:soot.jimple.JimpleBody 无法转换为 soot.dava.DavaBody
Soot: soot.jimple.JimpleBody cannot be cast to soot.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()
returns Body类型,不是JimpleBody,为什么会出现这个错误呢?
正文是声明的类型。在您的 Soot 配置中,它实际上 returns 一个 JimpleBody。
由documentation,public Body retrieveActiveBody()
是:
Returns the active body if present, else constructs an active body and returns that.
让我们看看 Body
class:
public abstract class Body
extends AbstractHost
implements Serializable
所以它是 Abstract
class,除此之外,它是 returns JimpleBody
,Body
的子class。
如果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 {
}
我运行以下代码获取.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()
returns Body类型,不是JimpleBody,为什么会出现这个错误呢?
正文是声明的类型。在您的 Soot 配置中,它实际上 returns 一个 JimpleBody。
由documentation,public Body retrieveActiveBody()
是:
Returns the active body if present, else constructs an active body and returns that.
让我们看看 Body
class:
public abstract class Body
extends AbstractHost
implements Serializable
所以它是 Abstract
class,除此之外,它是 returns JimpleBody
,Body
的子class。
如果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 {
}