Как я могу получить доступ к частному конструктору класса?

Я - Java-разработчик. В интервью меня задали вопрос о частных конструкторах:

Действительно ли можно ли получить доступ к частному конструктору класса и инстанцировать ли его?

Я ответил 'Нет', но был неправ.

Можно ли объяснить, почему я был неправ, и дайте пример инстанцирования объекта с частным конструктором?

68
задан eebbesen 28 October 2015 в 13:07
поделиться

6 ответов

Посмотрите на шаблон Singleton. Он использует частный конструктор.

0
ответ дан 24 November 2019 в 14:04
поделиться

Это может быть достигнуто с помощью отражения.

Рассмотрим для класса Test с частным конструктором:

Constructor<?> constructor  = Test.class.getDeclaredConstructor(Context.class, String[].class);
Assert.assertTrue(Modifier.isPrivate(constructor.getModifiers()));
constructor.setAccessible(true);
Object instance = constructor.newInstance(context, (Object)new String[0]);
20
ответ дан 24 November 2019 в 14:04
поделиться

Один из способов обойти ограничение - использовать отражения:

import java.lang.reflect.Constructor;

public class Example {
    public static void main(final String[] args) throws Exception {
        Constructor<Foo> constructor = Foo.class.getDeclaredConstructor();
        constructor.setAccessible(true);
        Foo foo = constructor.newInstance();
        System.out.println(foo);
    }
}

class Foo {
    private Foo() {
        // private!
    }

    @Override
    public String toString() {
        return "I'm a Foo and I'm alright!";
    }
}
83
ответ дан 24 November 2019 в 14:04
поделиться

Вы, конечно, можете получить доступ к частному конструктору из других методов или конструкторов в том же классе и его внутренние классы. Используя отражение, вы также можете использовать частный конструктор в другом месте, при условии, что SecurityManager не мешает вам это сделать.

3
ответ дан 24 November 2019 в 14:04
поделиться

Ну, вы также можете, если есть какие-либо другие общедоступные конструкторы. Тот факт, что конструктор без параметров является частным, не означает, что вы просто не можете создать экземпляр класса.

-1
ответ дан 24 November 2019 в 14:04
поделиться
  • Вы можете получить доступ к нему внутри самого класса (например, в общедоступном статическом фабричном методе)
  • Если это вложенный класс, вы можете получить к нему доступ из включающего класса
  • При наличии соответствующих разрешений вы можете получить к нему доступ с помощью отражения.

Не совсем ясно, применимо ли какое-либо из них - не могли бы вы предоставить дополнительную информацию?

70
ответ дан 24 November 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: