Как загрузить вложенные классы в Java? - PullRequest
15 голосов
/ 29 апреля 2011

У меня есть следующий код Java:

public class CheckInnerStatic {

private static class Test {
    static {
        System.out.println("Static block initialized");
    }
    public Test () {
        System.out.println("Constructor called");
    }
}

    public static void main (String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        System.out.println("Inside main");
        Class.forName("Test");    // Doesn't work, gives ClassNotFoundException
        //Test test = new Test();   // Works fine
    }
}

Почему class.forName("Test") не работает здесь, а следующая строка работает нормально?

Ответы [ 3 ]

30 голосов
/ 29 апреля 2011

Использовать Outer$Nested (независимо от того, является ли вложенный класс статическим или нет)

public class CheckInnerStatic {

    private static class Test {
    static {
        System.out.println("Static block initialized");
    }
    public Test () {
        System.out.println("Constructor called");
    }
}

    public static void main (String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        System.out.println("Inside main");
        Class<?> cls = Class.forName("CheckInnerStatic$Test");
        //Test test = new Test();
    }
}
9 голосов
/ 29 апреля 2011

Вам необходимо использовать полное имя класса, т.е. yourpackage.CheckInnerStatic$Test (при условии, что вы определили пакет, иначе пропустите эту часть).

7 голосов
/ 29 апреля 2011
Class innerClass = Class.forName("com.foo.OuterClass$InnerClass");
...