-
Если вы уже знаете, о чем я собираюсь написать, когда увидите название, кажется, что ваши навыки все еще лучше, чем мои;
Позвольте мне сначала написать односложенный шаблон:
просмотреть обычную копию в буфер обмена, распечатать?
Пакет Test.Reflect;
открытый класс Singleton {
Частный статический синглтон S = NULL;
private singleton () {
}
Public Static Singleton GetInstance () {
if (s == null) {
синхронизированный (singleton.class) {
if (s == null) {
S = новый Singleton ();
}
}
}
вернуть с;
}
}
Пакет Test.Reflect;
открытый класс Singleton {
Частный статический синглтон S = NULL;
private singleton () {
}
Public Static Singleton GetInstance () {
if (s == null) {
синхронизированный (singleton.class) {
if (s == null) {
S = новый Singleton ();
}
}
}
вернуть с;
}
}
Этот класс Singleton является моделью одного экземпляра, и его метод строительства является частным образом изменен Создать избыточные экземпляры.
Наш клиент выглядит следующим образом:
просмотреть обычную копию в буфер обмена, распечатать?
Singleton singleton = singleton.getinstance ();
System.out.println (Singleton);
// singleton = new Singleton (); это не работает
Singleton singleton = singleton.getinstance ();
System.out.println (Singleton);
// singleton = new Singleton (); это не работает
Результат печати заключается в следующем:
просмотреть обычную копию в буфер обмена, распечатать?
test.reflect.singleton@c17164
test.reflect.singleton@c17164
Но как мы можем создать экземпляр через частный конструктор?
Отражающая Java является важным модулем. Основной принцип отражения состоит в том, чтобы отобразить байт -код класса в объект класса, который может описать различную информацию о классе.
Ниже мы добавим код на стороне клиента:
просмотреть обычную копию в буфер обмена, распечатать?
Singleton singleton = singleton.getinstance ();
System.out.println (Singleton);
// singleton = new Singleton (); это не работает
Класс <?> Clazz = singleton.class;
// class <?> Clazz = class.forname ("test.reflect.singleton"); // Это также работает
Конструктор <?> [] Constructors = clazz.getDeclaredConstructors (); // Получить объявленный конструктор
Constructor <?> PrivateConstructor = Constructors [0]; // Singleton Class имеет только один конструктор
PrivateConstructor.setAccessible (true); // установить доступный для этого для работы
Singleton ancess = (singleton) privateconstructor.newinstance ();
System.out.println (экземпляр);
System.out.println (Singleton == Encament);
Singleton singleton = singleton.getinstance ();
System.out.println (Singleton);
// singleton = new Singleton (); это не работает
Класс <?> Clazz = singleton.class;
// class <?> Clazz = class.forname ("test.reflect.singleton"); // Это также работает
Конструктор <?> [] Constructors = clazz.getDeclaredConstructors (); // Получить объявленный конструктор
Constructor <?> PrivateConstructor = Constructors [0]; // Singleton Class имеет только один конструктор
PrivateConstructor.setAccessible (true); // установить доступный для этого для работы
Singleton ancess = (singleton) privateconstructor.newinstance ();
System.out.println (экземпляр);
System.out.println (Singleton == Encament);
Печатный результат:
просмотреть обычную копию в буфер обмена, распечатать?
test.reflect.singleton@c17164
test.reflect.singleton@1fb8ee3
ЛОЖЬ
test.reflect.singleton@c17164
test.reflect.singleton@1fb8ee3
ЛОЖЬ
Мы видим, что объекты, созданные дважды, разные.
Эта статья поступает из блога CSDN.
-