使用 soot 框架(v.2.5.0)我正在尝试加载某个类:
SootClass clazz = Scene.v().loadClassAndSupport("example.MyClass");
在调用Scene#loadClassAndSupport
课程之前example.MyClass
不在场景中 - 这是正确的。
该类也不存在于 soot 类路径中,并且上面的语句RuntimeException
会提示找不到该类。这也是正确的行为。
但是在抛出异常之后,班级example.MyClass
就在煤烟的场景中!
因此,另一个调用Scene#loadClassAndSupport
返回一个SootClass
实例,该实例isPhantom
设置为 false,但它没有任何方法或字段。
- 这种行为是由 soot 框架设计的还是一个错误?
- 如果是有意的,如何防止 Soot 向场景中添加“虚拟”SootClass?
- 是否有另一种方法来测试某个类是否在 Soot 的类路径中而不将其添加到 Soot 的场景中?
更新:
一个丑陋但可行的解决方法是:
try {
SootClass sootClass = Scene.v().loadClassAndSupport( className );
sootClass.setApplicationClass();
// class found and loaded...
} catch(RuntimeException e) {
SootClass sootClass = Scene.v().loadClassAndSupport( className );
Scene.v().removeClass( sootClass );
// class not on soot's classpath or not loadable...
}