Java 使用class.forName实例化嵌套的静态类
我有一个嵌套的静态类,比如:Java 使用class.forName实例化嵌套的静态类,java,static,Java,Static,我有一个嵌套的静态类,比如: 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 exce
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
我的代码有什么问题
Udo。嵌套类使用“$”作为分隔符:
Class.forName("a.b.TopClass$InnerClass");
这样,JRE就可以使用点来确定包,而不用担心嵌套类。如果查看生成的类文件,您会发现这一点,它将是TopClass$InnerClass.class
(编辑:为最初的错误道歉。在我想到文件名之前,Head一直卡在.NET中…试试看
Class.forName(“a.b.TopClass$InnerClass”)代码>通过美元符号访问内部类:
Class.forName("a.b.TopClass");
Class.forName("a.b.TopClass$InnerClass");
内部类总是通过美元符号访问,因为当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
这就是为什么我们使用$sign访问内部类。:)class.forName(“a.b.TopClass$InnerClass”)代码>…但如果可以避免,请不要这样做。