-
Se você já sabe sobre o que vou escrever ao ver o título, parece que suas habilidades ainda são melhores que as minhas, se estiver confuso, basta ler com atenção;
Deixe-me primeiro escrever um padrão singleton:
visualizar cópia simples para impressão da área de transferência?
pacote test.reflect;
classe pública Singleton {
singleton estático privado s = nulo;
Singleton privado() {
}
public static Singleton getInstance() {
if (s == nulo) {
sincronizado (Singleton.class) {
if (s == nulo) {
s = novo Singleton();
}
}
}
retornar;
}
}
pacote test.reflect;
classe pública Singleton {
singleton estático privado s = nulo;
Singleton privado() {
}
public static Singleton getInstance() {
if (s == nulo) {
sincronizado (Singleton.class) {
if (s == nulo) {
s = novo Singleton();
}
}
}
retornar;
}
}
Esta classe Singleton é um modelo de instância única e seu método de construção é modificado de forma privada. Classes externas não podem criar sua instância por meio de new. Elas só podem obter a instância chamando seu método estático getIntance e retorná-la em várias chamadas. criar instâncias redundantes.
Nosso cliente é o seguinte:
visualizar cópia simples para impressão da área de transferência?
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Isso não funciona
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Isso não funciona
O resultado da impressão é o seguinte:
visualizar cópia simples para impressão da área de transferência?
teste.reflect.Singleton@c17164
teste.reflect.Singleton@c17164
Mas como criamos uma instância através do construtor privado? A resposta é reflexão.
Java reflexivo é um módulo importante. Compreender a reflexão pode fazer muito trabalho para nós. O princípio básico da reflexão é mapear o bytecode de uma classe em um objeto Class que pode descrever várias informações sobre a classe.
Abaixo iremos adicionar algum código no lado do cliente:
visualizar cópia simples para impressão da área de transferência?
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Isso não funciona
Classe<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//Isso também funciona
Construtor<?>[] construtores = clazz.getDeclaredConstructors();//Obtém o construtor declarado
Constructor<?> privateConstructor = constructors[0];//A classe Singleton possui apenas um construtor
privateConstructor.setAccessible(true); //Definir acessível como true para operá-lo
Instância Singleton = (Singleton) privateConstructor.newInstance();
System.out.println(instância);
System.out.println(singleton == instância);
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Isso não funciona
Classe<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//Isso também funciona
Construtor<?>[] construtores = clazz.getDeclaredConstructors();//Obtém o construtor declarado
Constructor<?> privateConstructor = constructors[0];//A classe Singleton possui apenas um construtor
privateConstructor.setAccessible(true); //Definir acessível como true para operá-lo
Instância Singleton = (Singleton) privateConstructor.newInstance();
System.out.println(instância);
System.out.println(singleton == instância);
O resultado impresso é:
visualizar cópia simples para impressão da área de transferência?
teste.reflect.Singleton@c17164
teste.reflect.Singleton@1fb8ee3
falso
teste.reflect.Singleton@c17164
teste.reflect.Singleton@1fb8ee3
falso
Vemos que os objetos criados duas vezes são diferentes. Criamos uma instância da classe Singleton por meio do método construtor privado.
Este artigo vem do blog CSDN. Por favor, indique a fonte ao reimprimir: http://blog.csdn.net/liuhe688/archive/2009/12/31/5110637.aspx.
-