Как напечатать объект Java с помощью Groovy или другого языка JVM

Моя проблема в том, что я пытаюсь взаимодействовать с приложением Java, файл jar которого содержит запутанный байтовый код. Приложение выпускает обновления раз в месяц или около того, и когда они делают выпуск, большинство имен классов и методов меняются.

Таким образом, предлагаемый здесь метод:

http://rickyclarkson.blogspot.com/2006/07/duck-typing-in-java-and-no-reflection.html

or

Имитация утиного ввода в Java

не будет работать в моем решении, потому что мне придется каждый раз обновлять интерфейсы вручную.

Однако у меня есть автоматически сгенерированное (по большей части) сопоставление из деобфускированного имени класса ‹-> запутанного имени класса посредством анализа файлов классов на наличие вызовов для отладки вызовов ведения журнала в виде:

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 и т. д., поскольку они могли автоматически генерировать фиктивные объекты для меня, я надеюсь, что у меня будет какой-то тонкий слой, который позволит по-прежнему генерировать большинство моих фиктивных объектов. легко против того, чтобы вручную писать все, каждое обновление.


person Raindog    schedule 26.12.2013    source источник
comment
время запуска и настройки может занять несколько минут, тогда как я хочу, чтобы тестовая проверка длилась пару секунд - это исходное приложение, которое запускается так медленно, или ваш прокси?   -  person akhikhl    schedule 26.12.2013
comment
Зачем вам нужно запускать запутанную банку? Не могли бы вы просто импортировать его в муравей пути к классам, а затем пройти через отражение?   -  person Seagull    schedule 26.12.2013
comment
@akhikhl это оригинальный прокси.   -  person Raindog    schedule 26.12.2013
comment
@Seagull это то, что я делаю для взаимодействия. Приложение имеет 13 тысяч файлов классов, из которых более 100 могут быть мне потенциально интересны. Я уже вручную создаю прокси-классы с отображением 1:1, к которым затем применяю абстракцию для упрощения интерфейса... Я не хочу создавать один и тот же набор прокси для макетов, но это выглядит например, что я могу сделать, это добавить слой отражения для утиного набора текста...   -  person Raindog    schedule 26.12.2013


Ответы (1)


Если вы используете код из Java, я не думаю, что это возможно.

Однако, если вы запускаете код с Groovy, вы можете использовать метод GroovyMissing

См.: http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing

person Pyrolistical    schedule 13.01.2014