Я хочу проверить совместимость на уровне двоичных кодов между 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 ответа как довольно не связанные с темой.
Нужно ли проверять конкретный класс или общий инструмент для сравнения банок? Если это для 1 класса, просто загрузите класс в загрузчик пользовательского класса, проверьте сигнатуру методов с помощью отражения и все. Если он нужен для многих JAR/классов, то это будет слишком много работы.
Существует инструмент под именем Animal Sniffer, который позволяет извлечь подпись для API. Затем он может статически проверить, что пользователи API придерживаются подписи, и может статически проверить, что реализаторы API все реализовали. Я думаю, что это хорошо решит вашу проблему.
Вы можете скачать банку для Animal Sniffer из репозитория codehaus maven: http://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer/