Имея подобный код
public class PrivateConst { private PrivateConst() {} public class InnerClass{ public void f(){ System.out.println("hello"); } } }
Напрямую, в другом классе (вне обрамляющего), конечно, создать объект InnerClass следующим способом не получится:
PrivateConst.InnerClass priv = new PrivateConst().new InnerClass();
Но! Что если у нас есть метод, возвращающий экземпляр PrivateConst:
public class PrivateConst { private static PrivateConst instance; private PrivateConst() {} public static PrivateConst getInstance(){ instance = new PrivateConst(); return instance; } public class InnerClass{} }
В этом случае приватный конструктор нам не помеха для создания объекта InnerClass. Так же мы без проблем сможем создавать его в методах и в других внутренних классах, принадлежащих PrivateConst. Ответ — можно, если каким-либо способом нам удастся получить объект обрамляющего класса.
Так же можно по хардкору пройтись рефлексией, выдернуть скрытый коструктор и уже с его помощью добыть объект класса. Попахивает изнасилованием, но работает.
public class TestClass { public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException { Class clazz = PrivateConst.class; Constructor[] constructors = clazz.getDeclaredConstructors(); Constructor<PrivateConst> cons = constructors[0]; cons.setAccessible(true); PrivateConst priv = (PrivateConst) constructors[0].newInstance(); PrivateConst.InnerClass inner = priv.new InnerClass(); inner.f(); } }
Комментарии: