Разбирам, че за да създадете вътрешен клас (т.е. нестатичен), имате нужда от екземпляр на обхващащия клас. Това прави нещата малко по-сложни, ако обхващащият клас е абстрактен (не питайте). Помислете за следното.
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);
Представете си изненадата ми, когато това проработи. Въпросът ми е защо това проработи? И това винаги ли ще работи?