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

我有一个nested static class如:

 package ab public class TopClass { public static class InnerClass { } } 

我想用Class.forName()实例化,但它引发了一个ClassNotFoundException

 Class.forName("abTopClass"); // Works fine. Class.forName("abTopClass.InnerClass"); // raises exception TopClass.InnerClass instance = new TopClass.InnerClass(); // works fine 

我的代码有什么问题?

你做。

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

 Class.forName("abTopClass$InnerClass"); 

这样JRE可以使用点来确定包,而不用担心嵌套的类。 如果查看生成的类文件(这将是TopClass$InnerClass.class ,就会发现这个TopClass$InnerClass.class

(编辑:道歉的原始不准确。头被困在.NET土地,直到我想到文件名…)

尝试

Class.forName("abTopClass$InnerClass");

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

 Class.forName("abTopClass"); Class.forName("abTopClass$InnerClass"); 

内部类总是通过美元符号访问,因为当java编译器编译java源代码文件时,它会生成.class文件(字节代码)。

如果只有一个类,例如Hello.java,而这个类是一个外部类,那么编译器上的java编译器会生成Hello.class文件,但是如果这个类有一个内部类HelloInner,那么java编译器会生成Hello HelloInner.class(字节码)。

所以字节码总是看起来像下面的名字为Outer.java的片段:

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

所以字节码是:Outer $ Inner1 $ Inner2.class

这就是为什么我们使用$符号来访问内部类。