Динамическое создание внутреннего класса, вложенного в абстрактный класс - PullRequest
4 голосов
/ 10 декабря 2010

Я понимаю, что для создания экземпляра внутреннего класса (т. Е. Не статического) вам необходим экземпляр класса, в который он был помещен. Это немного усложняет ситуацию, если включающий класс является абстрактным (не спрашивайте). Подумайте о следующем.

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

Вообразите мое удивление, когда это сработало. Мой вопрос: почему это работает? И это всегда будет работать?

1 Ответ

5 голосов
/ 10 декабря 2010

Это сработало, потому что конструктор просто устанавливает поле Outer.this.Вероятно, он должен проверить, что он не нулевой (поэтому он быстро завершается с ошибкой), но быстрее, если это не так.

Я бы не стал полагать, что он всегда работает, есть все возможности, что разные JVM, даже разныеобновления будут работать по-другому.

на основе вашего предыдущего примера, это должно работать.

Inner instance = constructor.newInstance(new Outer(){});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...