Sé que esto es normalmente bastante estúpido, pero no me disparen antes de leer la pregunta. Prometo que tengo una buena razón para necesitar hacer esto :)¿Hay alguna forma de modificar el valor de un campo `private static final` en Java desde fuera de la clase?
Es posible modificar campos privados regulares en java mediante reflexión, sin embargo, Java arroja una excepción de seguridad cuando se intenta hacer lo mismo para los campos final
.
Supongo que esto se aplica estrictamente, pero pensé que lo haría de todos modos en caso de que alguien hubiera descubierto un truco para hacer esto.
Digamos que tengo una biblioteca externa con una clase "SomeClass
"
public class SomeClass
{
private static final SomeClass INSTANCE = new SomeClass()
public static SomeClass getInstance(){
return INSTANCE;
}
public Object doSomething(){
// Do some stuff here
}
}
que esencialmente quiere mono-Patch SomeClass para que pueda ejecutar mi propia versión de doSomething()
. Como no hay (que yo sepa) alguna forma de hacer eso realmente en Java, mi única solución aquí es alterar el valor de INSTANCE
para que devuelva mi versión de la clase con el método modificado.
Básicamente, solo quiero ajustar la llamada con un control de seguridad y luego llamar al método original.
La biblioteca externa siempre usa getInstance()
para obtener una instancia de esta clase (es decir, es un singleton).
EDITAR: Solo para aclarar, getInstance()
es llamado por la biblioteca externa, no es mi código, así que solo subclases no resolverá el problema.
Si no puedo hacer eso, la única otra solución que puedo pensar es copiar y pegar toda la clase y modificar el método. Esto no es ideal, ya que tendré que mantener actualizado mi fork con los cambios en la biblioteca. Si alguien tiene algo un poco más fácil de mantener, estoy abierto a sugerencias.
Lástima que no hay ningún método de extensión en Java –
Necesita Python: P – Rexsung
Me tomé la libertad de agregar "static" a getInstance(), ya que así es como se ve. –