-
Si vous savez déjà sur quoi je vais écrire lorsque vous voyez le titre, il semble que vos compétences soient encore meilleures que les miennes. Si vous êtes confus, lisez simplement attentivement.
Permettez-moi d'abord d'écrire un modèle singleton :
afficher la copie ordinaire dans le presse-papiers ?
paquet test.reflect;
classe publique Singleton {
Singleton statique privé s= null ;
privé Singleton() {
}
public statique Singleton getInstance() {
si (s == nul) {
synchronisé (Singleton.class) {
si (s == nul) {
s = nouveau Singleton();
}
}
}
retourner s ;
}
}
paquet test.reflect;
classe publique Singleton {
Singleton statique privé s= null ;
privé Singleton() {
}
public statique Singleton getInstance() {
si (s == nul) {
synchronisé (Singleton.class) {
si (s == nul) {
s = nouveau Singleton();
}
}
}
retourner s ;
}
}
Cette classe Singleton est un modèle à instance unique et sa méthode de construction est modifiée de manière privée. Les classes externes ne peuvent pas créer son instance via new. Elles ne peuvent obtenir l'instance qu'en appelant sa méthode statique getIntance et la renvoyer dans plusieurs appels, jamais. créer des instances redondantes.
Notre client est le suivant :
afficher la copie ordinaire dans le presse-papiers ?
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Cela ne marche pas
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Cela ne marche pas
Le résultat de l'impression est le suivant :
afficher la copie ordinaire dans le presse-papiers ?
test.reflect.Singleton@c17164
test.reflect.Singleton@c17164
Mais comment créer une instance via le constructeur privé La réponse est la réflexion.
Réfléchir Java est un module important. Comprendre la réflexion peut faire beaucoup de travail pour nous. Le principe de base de la réflexion est de mapper le bytecode d'une classe dans un objet Class pouvant décrire diverses informations sur la classe.
Ci-dessous, nous ajouterons du code côté client :
afficher la copie ordinaire dans le presse-papiers ?
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Cela ne marche pas
Classe<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//Cela fonctionne aussi
Constructeur<?>[] constructors = clazz.getDeclaredConstructors();//Obtenir le constructeur déclaré
Constructeur<?> privateConstructor = constructors[0];//La classe Singleton n'a qu'un seul constructeur
privateConstructor.setAccessible(true);//Définir accessible à true pour le faire fonctionner
Instance Singleton = (Singleton) privateConstructor.newInstance();
System.out.println(instance);
System.out.println(singleton == instance);
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Cela ne marche pas
Classe<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//Cela fonctionne aussi
Constructeur<?>[] constructors = clazz.getDeclaredConstructors();//Obtenir le constructeur déclaré
Constructeur<?> privateConstructor = constructors[0];//La classe Singleton n'a qu'un seul constructeur
privateConstructor.setAccessible(true);//Définir accessible à true pour le faire fonctionner
Instance Singleton = (Singleton) privateConstructor.newInstance();
System.out.println(instance);
System.out.println(singleton == instance);
Le résultat imprimé est :
afficher la copie ordinaire dans le presse-papiers ?
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
FAUX
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
FAUX
Nous voyons que les objets créés deux fois sont différents. Nous avons créé une instance de la classe Singleton via la méthode du constructeur privé.
Cet article provient du blog CSDN Veuillez indiquer la source lors de la réimpression : http://blog.csdn.net/liuhe688/archive/2009/12/31/5110637.aspx.
-