-
Si ya sabes sobre lo que voy a escribir cuando veas el título, parece que tus habilidades aún son mejores que las mías, si estás confundido, simplemente lee atentamente;
Primero déjame escribir un patrón singleton:
¿Ver copia simple en el portapapeles?
paquete test.reflect;
clase pública Singleton {
Singleton estático privado s = nulo;
singleton privado() {
}
getInstance único estático público () {
si (s == nulo) {
sincronizado (Singleton.class) {
si (s == nulo) {
s = nuevo Singleton();
}
}
}
devolver s;
}
}
paquete test.reflect;
clase pública Singleton {
Singleton estático privado s = nulo;
singleton privado() {
}
getInstance único estático público () {
si (s == nulo) {
sincronizado (Singleton.class) {
si (s == nulo) {
s = nuevo Singleton();
}
}
}
devolver s;
}
}
Esta clase Singleton es un modelo de instancia única y su método de construcción se modifica de forma privada. Las clases externas no pueden crear su instancia a través de new. Solo pueden obtener la instancia llamando a su método estático getIntance y devolverla en varias llamadas. crear instancias redundantes.
Nuestro cliente es el siguiente:
¿Ver copia simple en el portapapeles?
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Esto no funciona
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Esto no funciona
El resultado de la impresión es el siguiente:
¿Ver copia simple en el portapapeles?
prueba.reflect.Singleton@c17164
prueba.reflect.Singleton@c17164
Pero, ¿cómo creamos una instancia a través del constructor privado? La respuesta es la reflexión.
Java reflexivo es un módulo importante. Comprender la reflexión puede hacernos mucho trabajo. El principio básico de la reflexión es asignar el código de bytes de una clase a un objeto de clase que puede describir diversa información sobre la clase.
A continuación agregaremos algo de código en el lado del cliente:
¿Ver copia simple en el portapapeles?
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Esto no funciona
Clase<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//Esto también funciona
Constructor<?>[] constructores = clazz.getDeclaredConstructors();//Obtener el constructor declarado
Constructor<?> privateConstructor = constructors[0];//La clase Singleton tiene un solo constructor
privateConstructor.setAccessible(true);//Establecer accesible en verdadero para operarlo
Instancia singleton = (Singleton) privateConstructor.newInstance();
System.out.println(instancia);
System.out.println(singleton == instancia);
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Esto no funciona
Clase<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//Esto también funciona
Constructor<?>[] constructores = clazz.getDeclaredConstructors();//Obtener el constructor declarado
Constructor<?> privateConstructor = constructors[0];//La clase Singleton tiene un solo constructor
privateConstructor.setAccessible(true);//Establecer accesible en verdadero para operarlo
Instancia singleton = (Singleton) privateConstructor.newInstance();
System.out.println(instancia);
System.out.println(singleton == instancia);
El resultado impreso es:
¿Ver copia simple en el portapapeles?
prueba.reflect.Singleton@c17164
prueba.reflect.Singleton@1fb8ee3
FALSO
prueba.reflect.Singleton@c17164
prueba.reflect.Singleton@1fb8ee3
FALSO
Vemos que los objetos creados dos veces son diferentes. Creamos una instancia de la clase Singleton a través del método constructor privado.
Este artículo proviene del blog de CSDN. Indique la fuente al reimprimir: http://blog.csdn.net/liuhe688/archive/2009/12/31/5110637.aspx .
-