使用烟尘框架(v.2.5.0),我试图加载一个特定的类:
SootClass clazz = Scene.v().loadClassAndSupport("example.MyClass");
在调用Scene#loadClassAndSupport
之前,类example.MyClass
不在场景中-这是正确的。
类也不存在于烟灰类路径上,上面的语句抛出一个RuntimeException
,告诉类无法找到。这也是正确的行为。
但在抛出异常后,类example.MyClass
在烟灰的场景中!
因此,对Scene#loadClassAndSupport
的另一个调用返回SootClass
实例,其中isPhantom
被设置为false,但它没有任何方法或字段。
- 这个行为是由烟尘框架设计的还是一个bug?
- 如果它是有意的,我怎么能防止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...
}
这看起来像是一个bug。你能把它归档到这里吗?然后我们来看一看。https://github.com/Sable/soot/issues
无论如何,这是讨论这类问题的更好的地方。
欢呼,Eric