我有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
我的代码有什么问题?
乌
答案 0 :(得分:81)
嵌套类使用“$”作为分隔符:
Class.forName("a.b.TopClass$InnerClass");
这样,JRE可以使用点来确定包,而不必担心嵌套类。如果你看一下生成的类文件,你会看到这个,它将是TopClass$InnerClass.class
。
(编辑:对原始的不准确性表示歉意。在我考虑文件名之前,头部被困在.NET中......)
答案 1 :(得分:18)
尝试
Class.forName("a.b.TopClass$InnerClass");
答案 2 :(得分:8)
通过美元符号访问内部类:
Class.forName("a.b.TopClass");
Class.forName("a.b.TopClass$InnerClass");
答案 3 :(得分:1)
内部类总是通过美元符号访问,因为当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
{
}
}
}
所以字节代码是:外部$ Inner1 $ Inner2.class
这就是我们使用$ sign访问内部类的原因。:)