Я - Java-разработчик. В интервью меня задали вопрос о частных конструкторах:
Действительно ли можно ли получить доступ к частному конструктору класса и инстанцировать ли его?
Я ответил 'Нет', но был неправ.
Можно ли объяснить, почему я был неправ, и дайте пример инстанцирования объекта с частным конструктором?
Посмотрите на шаблон Singleton. Он использует частный конструктор.
Это может быть достигнуто с помощью отражения.
Рассмотрим для класса 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]);
Один из способов обойти ограничение - использовать отражения:
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!";
}
}
Вы, конечно, можете получить доступ к частному конструктору из других методов или конструкторов в том же классе и его внутренние классы. Используя отражение, вы также можете использовать частный конструктор в другом месте, при условии, что SecurityManager не мешает вам это сделать.
Ну, вы также можете, если есть какие-либо другие общедоступные конструкторы. Тот факт, что конструктор без параметров является частным, не означает, что вы просто не можете создать экземпляр класса.
Не совсем ясно, применимо ли какое-либо из них - не могли бы вы предоставить дополнительную информацию?