Сажа - Как запретить loadClassAndSupport создать пустой SootClass?
Используя сажу (v.2.5.0), я пытаюсь загрузить определенный класс:
SootClass clazz = Scene.v().loadClassAndSupport("example.MyClass");
Перед звонком Scene#loadClassAndSupport
класс example.MyClass
не в сцене - что правильно.
Класс также не существует на пути к классу сажи, и там приведенное выше выражение выдает RuntimeException
говоря, что класс не может быть найден. И это тоже правильное поведение.
Но после этого исключения был брошен класс example.MyClass
находится в сцене сажи!
Еще один звонок Scene#loadClassAndSupport
поэтому возвращает SootClass
экземпляр, где isPhantom
имеет значение false, но не имеет методов или полей.
- Это поведение предназначено для структуры сажи или это ошибка?
- Если это предусмотрено, как я могу предотвратить добавление 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...
}
1 ответ
Это похоже на ошибку. Можете ли вы подать это здесь? Затем мы посмотрим. https://github.com/Sable/soot/issues
В любом случае, это лучшее место для обсуждения таких вопросов.
Ура, Эрик