Отражение - Доступность открытых статических классов, вложенных в локальные классы пакета.

В моем примере у меня есть два пакета: 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Вы можете получить статический внутренний класс.

Другие вопросы по тегам