小编典典

用反射创建内部类对象

java

如何使用反射创建内部类对象?内部和外部类均具有不带参数的默认构造函数

Outer class {
    Inner class{
   }
    public void createO() {
        Outer.Inner ob = new Inner ();//that works
        Inner.class.newInstance(); //<--why does this not compile?
   }
}

阅读 329

收藏
2020-11-30

共1个答案

小编典典

“如果构造函数的声明类是非静态上下文中的内部类,则构造函数的第一个参数必须是封闭的实例;请参见 Java™语言规范的
15.9.3节。”

这意味着您永远不能使用Class.newInstance;
构造内部类。相反,您必须使用带有单个Outer实例的构造函数。这是一些示例代码,演示其用法:

class Outer {
    class Inner {
        @Override
        public String toString() {
            return String.format("#<Inner[%h] outer=%s>", this, Outer.this);
        }
    }

    @Override
    public String toString() {
        return String.format("#<Outer[%h]>", this);
    }

    public Inner newInner() {
        return new Inner();
    }

    public Inner newInnerReflect() throws Exception {
        return Inner.class.getDeclaredConstructor(Outer.class).newInstance(this);
    }

    public static void main(String[] args) throws Exception {
        Outer outer = new Outer();
        System.out.println(outer);
        System.out.println(outer.newInner());
        System.out.println(outer.newInnerReflect());
        System.out.println(outer.new Inner());
        System.out.println(Inner.class.getDeclaredConstructor(Outer.class).newInstance(outer));
    }
}

(请注意,在标准Java术语中, 内部类 始终是非静态的。静态成员类称为 嵌套类 。)

2020-11-30