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”)…但如果可以避免,请不要这样做。