Singleton reflexión, y la vulnerabilidad de secuencias solución!

Utilizando la técnica de reflexión para obtener un ejemplo diferente, la siguiente es una fórmula simple de morir de hambre singleton patrón implementos código:

Cuando necesitamos para obtener el objeto Singleton cuando llamar directamente al método estático getInstance en él:

Pero la reflexión aprendido de la gente sabe que la tecnología también puede ser obtenido a través de la reflexión a una instancia de una clase de objetos, incluso cuando la privatización de su constructor, también puede visitar su constructor es llamado por la violencia, por lo que ejecutar más clase de prueba los resultados son los siguientes:

Se puede observar adquirió mediante una llamada al método getInstance ejemplo es el mismo, pero reflejando adquirida por ejemplo, es diferente, en violación del diseño Singleton modo de pensar, entonces ¿cómo lo resolvemos? Tan sólo hay que añadir un juez para el constructor privado:

En este punto, comenzamos la clase de prueba una vez más, para obtener los siguientes resultados:

Por supuesto, para resolver el problema con la tecnología de reflexión para capturar las diferentes instancias.

Serialización y deserialización arte adquirió diferentes instancias:

Si nos Singleton clase implementa la interfaz Serializable, entonces esta clase se puede serializar y deserializar, el código de prueba es el siguiente:

Los resultados son los siguientes:

Encontramos referencias después de estar a la serialización y de-serialización de objetos fue alterado, y al parecer también en violación de la idea del patrón de diseño Singleton después de rastrear la fuente readObject, encontramos este método será el primero en escribir un newInstance, y luego determinar si este objeto este método tiene readResolve si, si no hay, a continuación, volver a este particular la newInstance, si está presente, se invoca readResolve este método, este método devuelve el valor devuelto al fragmento fuente readObject sigue:

De lo anterior, sólo tenemos que añadir un método a esta readResolve Singleton en esta clase.

Habilitar clase de prueba una vez más, los resultados son los siguientes:

Autor: Mazin
https://my.oschina.net/u/3441184/blog/884767

Publicado 50 artículos originales · ganado elogios 1706 · Vistas 2,22 millones +

Supongo que te gusta

Origin blog.csdn.net/zl1zl2zl3/article/details/105298523
Recomendado
Clasificación