Отражение - Доступность открытых статических классов, вложенных в локальные классы пакета.
В моем примере у меня есть два пакета: package1
содержит класс A
(НЕ объявлен как открытый) и его вложенный статический класс B
(объявлено как публичное):
package package1;
class A {
public static class B {
public B() {
}
}
public A() {
}
}
package2
содержит Main
класс с простым основным методом, который пытается рефлексивно создать экземпляр класса package1.A$B
:
package package2;
public class Main {
public static void main(String[] args) {
try {
Class<?> innerClass = Class.forName("package1.A$B");
Object o = innerClass.newInstance();
System.out.println(o);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
}
Удивительно (по крайней мере для меня), этот кусок кода успешно делает что-то невозможное без отражения. классический import
заявления (как import package1.A.B;
или же import package1.A.*;
) поднимать ошибки, утверждая, что класс A
не видно Более того, нет необходимости требовать специальных прав доступа для создания экземпляра B
, Это нормальное поведение?
РЕДАКТИРОВАТЬ: Это работает также, если я получаю ссылку на внутренний класс по-другому, как это:
Class<?> innerClass = Class.forName("package1.A").getClasses()[0];
1 ответ
Да, это абсолютно нормально. Когда пишешь как package.classname$innerclass
Вы можете получить статический внутренний класс.