Comportamientos curiosos de los Strings (la broma perfecta para un programador Java)
viernes, febrero 27, 2009 at 9:10AM A través de TSS he llegado a este artículo sobre programas en los que los String se comportan de un modo, a primera vista, incomprensible. El principio de todos los códigos es el mismo: los String literales en Java se internalizan, por lo que lo que a simple vista pueden parecer varios String diferentes dentro de la máquina virtual puede acabar siendo un único String. Esto es cierto para los String definidos dentro de una misma clase, dentro de todas las clases de un mismo paquete, y con frecuencia incluso entre paquetes diferentes.
Los códigos emplean reflexión para acceder a uno de los literales String internalizados y lo modifican. Esta modificación puede hacerse en una clase diferente, o incluso en un paquete diferente, del código que está viendo el programador al cual estamos "gastando esta broma". El código de reflexión ha modificado, por ejemplo, un atributo String de una clase de otro paquete y cambiado su contenido. Si en tiempo de compilación el compilador internalizó dicho String, todas las demás referencias que apunten a ese String verán modificado su valor.
En el artículo, además, también se juega con los hashcodes y con el diferente comportamiento de cada JDK a la hora de cachear su cálculo. Es muy divertido, y puede ser la base perfecta para una broma para un compañero que trabaje en nuestro mismo proyecto.
El autor del artículo afirma que esto puede constituir un fallo de seguridad, ya que potencialmente una clase que esté carga en la misma máquina virtual en la cual se ejecuta nuestro código podría modificar el comportamiento de nuestro código. Tengo bastantes dudas sobre esta afirmación; si bien él tiene razón, creo que todo el código que esté dentro de una máquina virtual o bien debe estar aislado empleando algún mecanismo como diferentes cargadores de clases, o bien no le queda más remedio que confiar el uno en el otro y suponer que no va a tener comportamientos raros. Lo contrario, creo que carece de sentido.
En cualquier caso, la lectura del artículo es divertida y educativa.
j2se 
Reader Comments