-
Kalau kalian sudah tahu apa yang akan saya tulis ketika melihat judulnya, sepertinya skill kalian masih lebih baik dari saya, kalau bingung baca saja baik-baik.
Izinkan saya menulis pola tunggal terlebih dahulu:
lihat salinan biasa ke cetak papan klip?
paket tes.reflect;
kelas publik Singleton {
pribadi statis Singleton s= null;
pribadi Singleton() {
}
getInstance Singleton statis publik() {
jika (s == nol) {
disinkronkan (Singleton.class) {
jika (s == nol) {
s = Singleton baru();
}
}
}
kembali;
}
}
paket tes.reflect;
kelas publik Singleton {
pribadi statis Singleton s= null;
pribadi Singleton() {
}
getInstance Singleton statis publik() {
jika (s == nol) {
disinkronkan (Singleton.class) {
jika (s == nol) {
s = Singleton baru();
}
}
}
kembali;
}
}
Kelas Singleton ini adalah model instance tunggal, dan metode konstruksinya dimodifikasi secara pribadi. Kelas eksternal tidak dapat membuat instance-nya melalui yang baru. Mereka hanya dapat memperoleh instance tersebut dengan memanggil metode statis getIntance, dan mengembalikannya dalam beberapa panggilan membuat instance yang berlebihan.
Klien kami adalah sebagai berikut:
lihat salinan biasa ke cetak papan klip?
Singleton singleton = Singleton.getInstance();
System.out.println(tunggal);
//singleton = new Singleton();Ini tidak berhasil
Singleton singleton = Singleton.getInstance();
System.out.println(tunggal);
//singleton = new Singleton();Ini tidak berhasil
Hasil cetaknya seperti berikut:
lihat salinan biasa ke cetak papan klip?
tes.reflect.Singleton@c17164
tes.reflect.Singleton@c17164
Tapi bagaimana kita membuat sebuah instance melalui konstruktor pribadi? Jawabannya adalah refleksi.
Java Reflektif adalah modul yang penting. Memahami refleksi dapat memberikan banyak manfaat bagi kita. Prinsip dasar refleksi adalah memetakan bytecode suatu kelas menjadi objek Kelas yang dapat mendeskripsikan berbagai informasi tentang kelas tersebut.
Di bawah ini kami akan menambahkan beberapa kode di sisi klien:
lihat salinan biasa ke cetak papan klip?
Singleton singleton = Singleton.getInstance();
System.out.println(tunggal);
//singleton = new Singleton();Ini tidak berhasil
Kelas<?> clazz = Singleton.kelas;
//Kelas<?> clazz = Class.forName("test.reflect.Singleton");//Ini juga berfungsi
Konstruktor<?>[] konstruktor = clazz.getDeclaredConstructors();//Dapatkan konstruktor yang dideklarasikan
Konstruktor<?> privateConstructor = konstruktor[0];//Kelas tunggal hanya memiliki satu konstruktor
privateConstructor.setAccessible(true);//Set dapat diakses ke true untuk mengoperasikannya
Contoh tunggal = (Singleton) privateConstructor.newInstance();
Sistem.keluar.println(contoh);
System.out.println(singleton == contoh);
Singleton singleton = Singleton.getInstance();
System.out.println(tunggal);
//singleton = new Singleton();Ini tidak berhasil
Kelas<?> clazz = Singleton.kelas;
//Kelas<?> clazz = Class.forName("test.reflect.Singleton");//Ini juga berfungsi
Konstruktor<?>[] konstruktor = clazz.getDeclaredConstructors();//Dapatkan konstruktor yang dideklarasikan
Konstruktor<?> privateConstructor = konstruktor[0];//Kelas tunggal hanya memiliki satu konstruktor
privateConstructor.setAccessible(true);//Set dapat diakses ke true untuk mengoperasikannya
Contoh tunggal = (Singleton) privateConstructor.newInstance();
Sistem.keluar.println(contoh);
System.out.println(singleton == contoh);
Hasil cetakannya adalah:
lihat salinan biasa ke cetak papan klip?
tes.reflect.Singleton@c17164
tes.reflect.Singleton@1fb8ee3
PALSU
tes.reflect.Singleton@c17164
tes.reflect.Singleton@1fb8ee3
PALSU
Kami melihat bahwa objek yang dibuat dua kali berbeda. Kami membuat instance kelas Singleton melalui metode konstruktor pribadi.
Artikel ini berasal dari blog CSDN. Harap sebutkan sumbernya saat mencetak ulang: http://blog.csdn.net/liuhe688/archive/2009/12/31/5110637.aspx
-