【问题标题】:Instantiate nested static class using Class.forName使用 Class.forName 实例化嵌套的静态类
【发布时间】:2011-10-23 21:12:26
【问题描述】:

我有一个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

我的代码有什么问题?

Udo。

【问题讨论】:

  • Class.forName("a.b.TopClass$InnerClass");
  • ...但如果可以避免,请不要这样做。

标签: java static


【解决方案1】:

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

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

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

(编辑:对最初的不准确表示歉意。在我考虑文件名之前,Head 一直停留在 .NET 领域......)

【讨论】:

    【解决方案2】:

    试试

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        所以字节码总是看起来像跟随名称为 Outer.java 的 sn-p:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-20
          • 2012-10-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-01
          相关资源
          最近更新 更多