Wiem, że to zwykle jest dość głupie, ale nie strzelaj do mnie przed przeczytaniem pytania. Obiecuję, że mam dobry powód, aby to zrobić :)Czy istnieje sposób modyfikowania wartości pola `private static final` w Javie spoza klasy?
Możliwe jest modyfikowanie zwykłych prywatnych pól w java za pomocą refleksji, jednak Java zgłasza wyjątek bezpieczeństwa, próbując zrobić to samo dla pól final
.
Założę się, że jest to ściśle egzekwowane, ale pomyślałem, że zapytam w każdym razie na wypadek, gdyby ktoś wymyślił hack, aby to zrobić.
Powiedzmy mam zewnętrznej biblioteki z klasą „SomeClass
”
public class SomeClass
{
private static final SomeClass INSTANCE = new SomeClass()
public static SomeClass getInstance(){
return INSTANCE;
}
public Object doSomething(){
// Do some stuff here
}
}
I zasadniczo chcą Monkey-Patch SomeClass tak, że mogę wykonać własną wersję doSomething()
. Ponieważ nie ma (według mojej wiedzy) żadnego sposobu na zrobienie tego w Javie, moim jedynym rozwiązaniem jest tutaj zmiana wartości INSTANCE
, więc zwraca ona moją wersję klasy za pomocą zmodyfikowanej metody.
Zasadniczo po prostu chcę zakończyć wywołanie sprawdzaniem bezpieczeństwa, a następnie wywołać oryginalną metodę.
Biblioteka zewnętrzna zawsze używa getInstance()
, aby uzyskać wystąpienie tej klasy (tj. Jest to singleton).
EDYCJA: Aby wyjaśnić, getInstance()
jest wywoływana przez bibliotekę zewnętrzną, nie mój kod, więc tylko podklasy nie rozwiąże problemu.
Jeśli nie mogę tego zrobić, jedyne inne rozwiązanie, jakie mogę wymyślić, to skopiować i wkleić całą klasę i zmodyfikować metodę. Nie jest to idealne rozwiązanie, ponieważ będę musiał aktualizować moje widły, wprowadzając zmiany w bibliotece. Jeśli ktoś ma coś więcej do utrzymania, jestem otwarty na sugestie.
Szkoda, że nie ma żadnych metod rozszerzania w Javie –
Potrzebujesz pythona: P – Rexsung
Mogłem dodać "static" do getInstance(), ponieważ prawdopodobnie tak to wygląda. –