Как определить отсутствующий метод (Совместимость на уровне двоичных кодов) в JAR статически

Я хочу проверить совместимость на уровне двоичных кодов между 2 БАНКАМИ.

После предложений в этом ответе я использовал jboss ябеду, но он может найти только недостающие классы.

Как я могу найти, существуют ли отсутствующие методы? Действительно ли это возможно вообще?

Например.

"Зависит - от" класса, Foo зависит от Панели (как многие другие рабочие среднего класса)

import org.overlyusedclassnames.Bar

public class Foo{
    public void someMethod(){
         Bar tender = new Bar();
         tender.getJohnnyRedLabel();
         tender.getJohnnyBlueLabel(); //this method is new in the Bar class
    }
}

Класс "Времени компиляции"

package org.overlyusedclassnames;

/** 
 * @Since 1992
 * Changes: added blue and gold Johnny Walker labels
 */

public class Bar {
    public Drink getJohnnyRedLabel(){
         return new JohnyWalkerFactory.get(RedLabel.class);
    }

    public Drink getJohnnyBlackLabel(){
         return new JohnyWalkerFactory.get(BlackLabel.class);
    }

    public Drink getJohnnyGoldLabel(){
         return new JohnyWalkerFactory.get(GoldLabel.class);
    }

    public Drink getJohnnyBlueLabel(){
         return new JohnyWalkerFactory.get(BlueLabel.class);
    }

}

Теперь предположите, что старая банка Панели случайно заменяет скомпилированную панель времени:

"Время во время выполнения" класс

package org.overlyusedclassnames;

/** 
 * @Since 1909
 * Changes: added red and black Johnny Walker labels
 */

public class Bar {
    public Drink getJohnnyRedLabel(){
         return new JohnyWalkerFactory.get(RedLabel.class);
    }

    public Drink getJohnnyBlackLabel(){
         return new JohnyWalkerFactory.get(BlackLabel.class);
    }
}

Есть ли способ определить отсутствующий метод, не выполняя его и добираясь a NoSuchMethodError?


Отказ от ответственности: Это - основное перефразирование моего собственного связанного вопроса, который является неудаляемым. Я выбрал задавание нового вопроса, потому что перефразирование представит текущие 2 ответа как довольно не связанные с темой.

18
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

Нужно ли проверять конкретный класс или общий инструмент для сравнения банок? Если это для 1 класса, просто загрузите класс в загрузчик пользовательского класса, проверьте сигнатуру методов с помощью отражения и все. Если он нужен для многих JAR/классов, то это будет слишком много работы.

0
ответ дан 30 November 2019 в 08:21
поделиться

Существует инструмент под именем Animal Sniffer, который позволяет извлечь подпись для API. Затем он может статически проверить, что пользователи API придерживаются подписи, и может статически проверить, что реализаторы API все реализовали. Я думаю, что это хорошо решит вашу проблему.

Вы можете скачать банку для Animal Sniffer из репозитория codehaus maven: http://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer/

2
ответ дан 30 November 2019 в 08:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: