So che questo è normalmente piuttosto stupido, ma non spararmi prima di leggere la domanda. Prometto di avere una buona ragione per doverlo fare :)Esiste un modo per modificare il valore di un campo `private static final` in Java al di fuori della classe?
È possibile modificare i normali campi privati in java utilizzando la reflection, tuttavia Java genera un'eccezione di sicurezza quando si tenta di fare lo stesso per i campi final
.
Immagino che questo sia applicato in modo rigoroso, ma ho pensato di chiederlo comunque nel caso qualcuno avesse scoperto un trucco per farlo.
Diciamo solo dire che ho una libreria esterna con una classe "SomeClass
"
public class SomeClass
{
private static final SomeClass INSTANCE = new SomeClass()
public static SomeClass getInstance(){
return INSTANCE;
}
public Object doSomething(){
// Do some stuff here
}
}
ho essenzialmente vogliono scimmia-Patch SomeClass in modo che possa eseguire la mia versione di doSomething()
. Dal momento che non c'è (a mia conoscenza) un modo per farlo veramente in java, la mia unica soluzione qui è modificare il valore di INSTANCE
in modo che restituisca la mia versione della classe con il metodo modificato.
In sostanza, voglio solo chiudere la chiamata con un controllo di sicurezza e quindi chiamare il metodo originale.
La libreria esterna utilizza sempre getInstance()
per ottenere un'istanza di questa classe (vale a dire è un singleton).
EDIT: Giusto per chiarire, getInstance()
viene chiamato dalla libreria esterna, non dal mio codice, quindi solo la sottoclasse non risolverà il problema.
Se non riesco a farlo, l'unica altra soluzione a cui posso pensare è copiare e incollare l'intera classe e modificare il metodo. Questo non è l'ideale in quanto dovrò tenere aggiornata la mia forcella con le modifiche alla libreria. Se qualcuno ha qualcosa di più gestibile, sono aperto ai suggerimenti.
Peccato che non ci siano metodi di estensione in Java –
Hai bisogno di python: P – Rexsung
Mi sono preso la libertà di aggiungere "statico" a getInstance(), poiché probabilmente è così che sembra. –