使用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
这就是为什么我们使用$符号来访问内部类。