使用Class.forName实例化嵌套的静态类

时间:2011-08-10 08:24:41

标签: java static

我有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 个答案:

答案 0 :(得分:81)

嵌套类使用“$”作为分隔符:

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

这样,JRE可以使用点来确定包,而不必担心嵌套类。如果你看一下生成的类文件,你会看到这个,它将是TopClass$InnerClass.class

(编辑:对原始的不准确性表示歉意。在我考虑文件名之前,头部被困在.NET中......)

答案 1 :(得分:18)

尝试

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

答案 2 :(得分:8)

通过美元符号访问内部类:

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

答案 3 :(得分:1)

内部类总是通过美元符号访问,因为当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
             {  
              }
         }
       }

所以字节代码是:外部$ Inner1 $ Inner2.class

这就是我们使用$ sign访问内部类的原因。:)