Моя проблема в том, что я пытаюсь взаимодействовать с приложением Java, файл jar которого содержит запутанный байтовый код. Приложение выпускает обновления раз в месяц или около того, и когда они делают выпуск, большинство имен классов и методов меняются.
Таким образом, предлагаемый здесь метод:
http://rickyclarkson.blogspot.com/2006/07/duck-typing-in-java-and-no-reflection.html
or
не будет работать в моем решении, потому что мне придется каждый раз обновлять интерфейсы вручную.
Однако у меня есть автоматически сгенерированное (по большей части) сопоставление из деобфускированного имени класса ‹-> запутанного имени класса посредством анализа файлов классов на наличие вызовов для отладки вызовов ведения журнала в виде:
logger.log(severity, "ClassName", "MethodName() has some error")
То, что я генерирую, выглядит примерно так:
public final static String MyRealName = "someObfuscatedName".
public final static String MyRealName_myCoolMethod = "someMethodName".
У меня есть довольно приличное решение для взаимодействия с объектами «myRealName» через API отражения и просто прокси-объекты, которые реализуют подмножество функций объекта, который он проксирует. Примерно так:
class MyRealName {
private Object backingObject;
public MyRealName(Object o) { backingObject = o;}
public void myCoolMethod() {
return getFieldValue(backingObject
, DeobNames.MyRealName_myCoolMethod);
}
}
Однако проблема возникает, когда я хочу протестировать свой код при отсутствии запущенного обфусцированного приложения — время запуска и настройки может занять несколько минут, тогда как я хочу, чтобы тестовая проверка длилась пару секунд.
То, что я ищу, — это способ легко адаптировать мои тесты для соответствия часто меняющимся именам классов, от которых зависит мой код.
Я был заинтригован мощью таких инструментов, как JMockit и т. д., поскольку они могли автоматически генерировать фиктивные объекты для меня, я надеюсь, что у меня будет какой-то тонкий слой, который позволит по-прежнему генерировать большинство моих фиктивных объектов. легко против того, чтобы вручную писать все, каждое обновление.