Можно ли создать объект внутреннего класса, если у внешнего класса только private конструктор?

Имея подобный код

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();
    }
}

 

Понравилась статья? Поделиться с друзьями:

Комментарии:

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: