【问题标题】:Why is it thrown java.lang.InstantiationException? [duplicate]为什么会抛出 java.lang.InstantiationException? [复制]
【发布时间】:2017-11-25 11:53:51
【问题描述】:

看下面的代码:

public class Outer {
    public static void main(String[] args) throws Exception {
        new Outer().greetWorld();
    }

    private void greetWorld() throws Exception {
        System.out.println(Inner.class.newInstance());
    }

    public class Inner {
        public Inner () {}
        public String toString(){
            return "HelloWorld";
        }
    }
}

为什么会抛出java.lang.InstantiationException
毕竟,嵌套类Inner 具有无效的构造函数。谁能解释一下?

【问题讨论】:

  • javap -c Outer$Inner 会解释原因。
  • 我想注意到公共默认构造函数可能不存在,这使得通过反射 API 构建内部实例是不可能的。你肯定需要处理NoSuchMethodException 异常

标签: java reflection constructor inner-classes


【解决方案1】:

内部类的构造函数中的[隐式]第一个参数是对其封闭类的引用。通过反射调用时,需要显式提供:

private void greetWorld() throws Exception {
    System.out.println(Inner.class.getConstructors()[0].newInstance(this));
}

【讨论】:

  • 你确定它会编译吗? newInstance 应该在 Constructor 实例上调用,而不是 Class
  • System.out.println(Inner.class.getConstructor(Outer.class).newInstance(this));
  • 在这方面领先于自己...已编辑和修复。
  • @JBNizet,如果没有公共默认构造函数会抛出异常
  • @AndrewTobilko 当然。但是有一个。
【解决方案2】:

您的类 Inner 需要实例化,一种解决方案是将其声明为静态。

static class Inner {
    public Inner () {}
    public String toString(){
        return "HelloWorld";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多