【问题标题】:creating inner class objects with reflection用反射创建内部类对象
【发布时间】:2014-04-11 02:42:07
【问题描述】:

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

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

【问题讨论】:

    标签: java object reflection inner-classes


    【解决方案1】:

    "If the constructor's declaring class is an inner class in a non-static context, the first argument to the constructor needs to be the enclosing instance; see section 15.9.3 of The Java™ Language Specification."

    这意味着你永远不能使用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 术语中,内部类始终是非静态的。静态成员类称为嵌套类。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-14
      • 2011-03-30
      • 2012-05-15
      • 2017-03-29
      • 2015-05-09
      • 2015-07-30
      • 1970-01-01
      相关资源
      最近更新 更多