【问题标题】:How to load nested classes in Java?如何在 Java 中加载嵌套类?
【发布时间】:2011-04-29 06:52:41
【问题描述】:

我有以下java代码:

public class CheckInnerStatic {

private static class Test {
    static {
        System.out.println("Static block initialized");
    }
    public Test () {
        System.out.println("Constructor called");
    }
}

    public static void main (String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        System.out.println("Inside main");
        Class.forName("Test");    // Doesn't work, gives ClassNotFoundException
        //Test test = new Test();   // Works fine
    }
}

为什么class.forName("Test") 在这里不工作,而下一行工作正常?

【问题讨论】:

  • 只是为了正确设置术语,没有什么能比得上静态内部类。您已经嵌套了类 - 静态和非静态(内部)。

标签: java static inner-classes


【解决方案1】:

使用Outer$Nested(不管嵌套类是否为静态)

public class CheckInnerStatic {

    private static class Test {
    static {
        System.out.println("Static block initialized");
    }
    public Test () {
        System.out.println("Constructor called");
    }
}

    public static void main (String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        System.out.println("Inside main");
        Class<?> cls = Class.forName("CheckInnerStatic$Test");
        //Test test = new Test();
    }
}

【讨论】:

    【解决方案2】:

    您需要使用完全限定的类名,即yourpackage.CheckInnerStatic$Test(假设您定义了一个包,否则跳过该部分)。

    【讨论】:

    • 很抱歉,但这似乎也不起作用,我错了吗?另外,我如何能够实例化 Test 类而不提供您所说的全名但无法加载它?
    • 使用yourpackage.CheckInnerStatic$Test。 $ 符号用于限定内部类。
    • 请更新您的答案。您需要使用 $ 字符而不是点来加载内部类。
    【解决方案3】:
    Class innerClass = Class.forName("com.foo.OuterClass$InnerClass");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2014-10-15
      相关资源
      最近更新 更多