Я понимаю, что для создания экземпляра внутреннего класса (т. Е. Не статического) вам необходим экземпляр класса, в который он был помещен. Это немного усложняет ситуацию, если включающий класс является абстрактным (не спрашивайте). Подумайте о следующем.
abstract class Outer {
class Inner {}
}
Создание экземпляра Inner
все еще вполне выполнимо статически, например, с анонимным классом, подобным этому.
Inner instance = new Outer() {}.new Inner();
Но тогда как сделать то же самое динамически с Constructor.newInstance
? (Обратите внимание, что я сказал динамически; предположим, вы не знаете имя внешнего класса.) Для первого аргумента вам нужно будет передать экземпляр включающего класса в соответствии с JLS 15.9.3 и если есть способ создать что-то на лету, чтобы удовлетворить абстрактный параметр, я не знаю об этом (бонусные баллы за любые идеи там).
Короче говоря, я случайно попал в null
, вот так.
Constructor<Inner> constructor = Inner.class.getDeclaredConstructor(Outer.class);
Object argument = null;
Inner instance = constructor.newInstance(argument);
Вообразите мое удивление, когда это сработало. Мой вопрос: почему это работает? И это всегда будет работать?