Я знаю, что это обычно довольно глупо, но не стреляйте в меня, прежде чем читать вопрос. Я обещаю, что у меня есть все основания для этого:)
Можно изменить обычные частные поля в 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()
, чтобы получить экземпляр этого класса (т.е. одноэлементный).
EDIT: просто для пояснения, getInstance()
вызывается внешней библиотекой, а не моим кодом, поэтому просто подклассификация не решит проблему.
Если я не могу этого сделать, единственное другое решение, о котором я могу думать, это скопировать-вставить весь класс и изменить метод. Это не идеально, так как мне нужно будет обновить свою вилку с изменениями в библиотеке. Если у кого-то есть что-то более удобное, я открыт для предложений.