Создание вложенного статического класса с использованием Class.forName - PullRequest
50 голосов
/ 10 августа 2011

У меня есть nested static class, как:

package a.b
public class TopClass {

    public static class InnerClass {
    }
}

Я хочу создать экземпляр с Class.forName(), но это поднимает ClassNotFoundException.

Class.forName("a.b.TopClass"); // Works fine.
Class.forName("a.b.TopClass.InnerClass"); // raises exception

TopClass.InnerClass instance = new TopClass.InnerClass(); // works fine

Что не так в моемкод?

Удо.

Ответы [ 4 ]

81 голосов
/ 10 августа 2011

Вложенные классы используют «$» в качестве разделителя:

Class.forName("a.b.TopClass$InnerClass");

Таким образом, JRE может использовать точки для определения пакетов, не заботясь о вложенных классах.Вы заметите это, если посмотрите на сгенерированный файл класса, который будет TopClass$InnerClass.class.

(РЕДАКТИРОВАТЬ: Извинения за первоначальную неточность. Голова застряла в земле .NET, пока я не подумал об именах файлов...)

18 голосов
/ 10 августа 2011

попробуй

Class.forName("a.b.TopClass$InnerClass");

8 голосов
/ 10 августа 2011

Внутренние классы доступны через знак доллара:

Class.forName("a.b.TopClass"); 
Class.forName("a.b.TopClass$InnerClass"); 
0 голосов
/ 11 августа 2014

Внутренний класс всегда доступен через знак доллара, потому что когда компилятор java компилирует файл исходного кода java, он генерирует файл .class (байт-код).

если существует только один класс, например Hello.java, и этот класс является внешним классом, то компилятор java при компиляции создает файл Hello.class, но если этот класс имеет внутренний класс HelloInner, то компилятор java генерирует d Hello $ HelloInner.class (байт-код).

, поэтому байт-код всегда выглядит как следующий фрагмент с именем Outer.java:

.
   public class   Outer
   {
     public  var;//member variable
       Outer()//constructor
       {
        }
       class  Inner1
        {
          class Inner2
             {  
              }
         }
       }

, поэтому байт-код: Outer $ Inner1 $ Inner2.class

именно поэтому мы используем знак $ для доступа к внутреннему классу.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...