Можно ли заменить публичный статический метод в Java? - PullRequest
2 голосов
/ 22 января 2012

Я использую библиотеку с открытым статическим методом getFile(), определенным в классе Utils. Библиотека очень часто использует Utils.getFile(), но этот метод не очень хорошо реализован.

Мне было интересно, можно ли как-то переопределить Utils.getFile(), чтобы вместо него использовалась моя реализация?

Ответы [ 5 ]

4 голосов
/ 22 января 2012

Нет - не слишком много копируя класс и заменяя его там. В противном случае лучшей альтернативой может быть +1 для комментария Кристиана: Почему Java не допускает переопределение статических методов?

Если он был нестатичным, а метод не был закрытым или окончательным, вы можете создать подкласс класса, предоставить собственный переопределенный метод и использовать его.

1 голос
/ 22 января 2012

У вас единственный вариант - заменить класс. Вы можете скомпилировать другую версию и сделать ее раньше в пути к классам или заменить оригинальную копию.

Java не поддерживает полиморфизм для статических методов (вы можете скрыть, но не переопределять статический метод). По этой причине классы Utility часто устанавливаются final, чтобы прояснить это. Для реализации этого я использую enum без экземпляров.

public enum Util {;
    public static ReturnType method(ParameterTypes... args) {
    }
}
1 голос
/ 22 января 2012

Нет, вы не можете переопределить это. Статические методы имеют такие проблемы, например, при написании модульных тестов.

0 голосов
/ 22 января 2012

К сожалению, нет. Этот ответ на StackOverflow объясняет, почему это .Вам необходимо создать класс-оболочку.Это относится к большинству языков, снова объясненных в ссылке.

0 голосов
/ 22 января 2012

Исправьте код, получив исходный код библиотеки и воссоздайте файл jar.Попробуйте использовать JAD (вместе с FrontEndPlus), чтобы декомпилировать файлы .class в файлы .java.

Если вызовы содержатся в вашем коде, то вы можете использовать полное имя класса Utils с префиксом метода.Пример: {ваше пространство имен} .Utils.getFile () ..

...