-
Wenn Sie beim Lesen des Titels bereits wissen, worüber ich schreiben werde, scheinen Ihre Fähigkeiten immer noch besser zu sein als meine. Wenn Sie verwirrt sind, lesen Sie einfach sorgfältig durch.
Lassen Sie mich zunächst ein Singleton-Muster schreiben:
Klartext in Zwischenablage anzeigen und drucken?
Paket test.reflect;
öffentliche Klasse Singleton {
privater statischer Singleton s= null;
privater Singleton() {
}
öffentliches statisches Singleton getInstance() {
if (s == null) {
synchronisiert (Singleton.class) {
if (s == null) {
s = new Singleton();
}
}
}
return s;
}
}
Paket test.reflect;
öffentliche Klasse Singleton {
privater statischer Singleton s= null;
privater Singleton() {
}
öffentliches statisches Singleton getInstance() {
if (s == null) {
synchronisiert (Singleton.class) {
if (s == null) {
s = new Singleton();
}
}
}
return s;
}
}
Diese Singleton-Klasse ist ein Einzelinstanzmodell, und ihre Konstruktionsmethode kann nicht durch neue Methoden erstellt werden. Sie können die Instanz nur durch Aufrufen ihrer statischen Methode getIntance abrufen und niemals in einer Instanz zurückgeben Erstellen Sie redundante Instanzen.
Unser Kunde ist wie folgt:
Klartext in Zwischenablage anzeigen und drucken?
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Das funktioniert nicht
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Das funktioniert nicht
Das Druckergebnis ist wie folgt:
Klartext in Zwischenablage anzeigen und drucken?
test.reflect.Singleton@c17164
test.reflect.Singleton@c17164
Aber wie erstellen wir eine Instanz über den privaten Konstruktor? Die Antwort ist Reflexion.
Reflektierendes Java ist ein wichtiges Modul. Das Verständnis der Reflexion kann uns viel Arbeit abnehmen. Das Grundprinzip der Reflexion besteht darin, den Bytecode einer Klasse einem Klassenobjekt zuzuordnen, das verschiedene Informationen über die Klasse beschreiben kann.
Nachfolgend fügen wir auf der Clientseite Code hinzu:
Klartext in Zwischenablage anzeigen und drucken?
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Das funktioniert nicht
Klasse<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//Das funktioniert auch
Constructor<?>[] constructiontors = clazz.getDeclaredConstructors();//Den deklarierten Konstruktor abrufen
Constructor<?> privateConstructor = Konstruktoren[0];//Die Singleton-Klasse hat nur einen Konstruktor
privateConstructor.setAccessible(true); // Zugänglich auf true setzen, um es zu betreiben
Singleton-Instanz = (Singleton) privateConstructor.newInstance();
System.out.println(instance);
System.out.println(singleton == Instanz);
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();Das funktioniert nicht
Klasse<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//Das funktioniert auch
Constructor<?>[] constructiontors = clazz.getDeclaredConstructors();//Den deklarierten Konstruktor abrufen
Constructor<?> privateConstructor = Konstruktoren[0];//Die Singleton-Klasse hat nur einen Konstruktor
privateConstructor.setAccessible(true); // Zugänglich auf true setzen, um es zu betreiben
Singleton-Instanz = (Singleton) privateConstructor.newInstance();
System.out.println(instance);
System.out.println(singleton == Instanz);
Das gedruckte Ergebnis ist:
Klartext in Zwischenablage anzeigen und drucken?
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
FALSCH
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
FALSCH
Wir sehen, dass die zweimal erstellten Objekte unterschiedlich sind. Wir haben über die private Konstruktormethode eine Instanz der Singleton-Klasse erstellt.
Dieser Artikel stammt aus dem CSDN-Blog. Bitte geben Sie beim Nachdruck die Quelle an: http://blog.csdn.net/liuhe688/archive/2009/12/31/5110637.aspx
-