Class.getDeclaredConstructors() плюс setAccessible(true) могут напрямую вызывать конструктор private, создавая второй экземпляр независимо от нулевых проверок getInstance(). JVM специально запрещает рефлексивное создание экземпляров типов enum, поэтому эта атака терпит неудачу во время выполнения против одноэлементного перечисления.
Пример
// Classic GoF Singleton: enforced by the class itselfpublicclassConfigManager {
privatestaticfinalConfigManagerINSTANCE=newConfigManager();
privateConfigManager() {} // private constructor blocks any other instantiationpublicstaticConfigManagergetInstance() { return INSTANCE; }
}
Итог
Class.getDeclaredConstructors() плюс setAccessible(true) могут напрямую вызывать конструктор private, создавая второй экземпляр независимо от нулевых проверок getInstance().
Как отражение может сломать стандартный синглтон и почему это не ра… · Sobeso