当前位置: 首页 > 面试题库 >

用反射创建内部类对象

穆文斌
2023-03-14
问题内容

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

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

问题答案:

“如果构造函数的声明类是非静态上下文中的内部类,则构造函数的第一个参数必须是封闭的实例;请参见 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术语中, 内部类 始终是非静态的。静态成员类称为 嵌套类 。)



 类似资料:
  • 问题内容: 给定班级价值: 我正在尝试使用创建该类的新实例: 从主要: 这不起作用,Eclipse的输出: 如果是这样,怎么可以用我创建了一个新的价值目标,在那里我调用的? 谢谢 问题答案: 您需要为此找到确切的构造函数。只能用于调用null构造函数。所以写

  • 给定的类值: 我正在尝试使用创建该类的一个新实例: 如果是,我如何使用创建一个新的值对象,在这里我调用的? 谢谢

  • 我正在试验反射库发现:https://code.google.com/p/reflections/ 我试图实现的是扫描项目中的一个包,然后创建在该包中找到的给定类型的所有子类的实例。我使用库的方式是正确的,因为子类型返回以下内容: [class identifiers.DNSLookup,class identifiers.AliasChecker,class identifiers.Google

  • 问题内容: 是否可以使用Java反射从另一个类实例化私有内部类。例如,如果我采用了这段代码 是否可以实例化并从main类中的main方法获得对Test的访问。 问题答案: 使用反射时,您会发现该内部类的构造函数将外部类的实例作为附加参数(总是第一个)。 例:

  • 是否可以从类main中的main方法实例化并获得对Test的访问。

  • 本文向大家介绍详解C# 利用反射根据类名创建类的实例对象,包括了详解C# 利用反射根据类名创建类的实例对象的使用技巧和注意事项,需要的朋友参考一下 “反射”其实就是利用程序集的元数据信息。 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间。 1、假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): 2、若要反射当前项目中的类(即当前项目已经引用它了