Я знаю, что это обычно довольно глупо, но не стреляйте в меня, прежде чем читать вопрос. Обещаю, у меня есть веская причина для этого:)
Можно изменить обычные частные поля в java, используя отражение, однако Java выдает исключение безопасности при попытке сделать то же самое для final
полей.
Я бы предположил, что это строго соблюдается, но решил в любом случае спросить на всякий случай, если кто-то придумал, как это сделать.
Скажем так, у меня есть внешняя библиотека с классом "SomeClass
"
public class SomeClass
{
private static final SomeClass INSTANCE = new SomeClass()
public static SomeClass getInstance(){
return INSTANCE;
}
public Object doSomething(){
// Do some stuff here
}
}
По сути, я хочу Monkey-Patch SomeClass, чтобы я мог выполнить свою собственную версию doSomething()
. Так как (насколько мне известно) нет никакого способа действительно сделать это в Java, мое единственное решение здесь состоит в том, чтобы изменить значение INSTANCE
, чтобы он возвращал мою версию класса с измененным методом.
По сути, я просто хочу обернуть вызов проверкой безопасности, а затем вызвать оригинальный метод.
Внешняя библиотека всегда использует getInstance()
для получения экземпляра этого класса (т. Е. Это синглтон).
РЕДАКТИРОВАТЬ: Просто чтобы уточнить, getInstance()
вызывается внешней библиотекой, а не моим кодом, так что простое использование подклассов не решит проблему.
Если я не могу этого сделать, единственное другое решение, о котором я могу подумать, - это скопировать-вставить весь класс и изменить метод. Это не идеально, так как мне придется регулярно обновлять свою библиотеку. Если у кого-то есть что-то более понятное, я открыт для предложений.