【问题标题】:Create new instance of object's class创建对象类的新实例
【发布时间】:2013-08-14 20:08:04
【问题描述】:

假设我有一个名为 myCar 的对象,它是 Car 的一个实例。

myCar = new Car();

如何根据对象创建该类的新实例?假设我不知道 myCar 是从哪个类创建的。

otherObject = new myCar.getClass()(); // Just do demonstrate what I mean (I know this doesn't work)

更新

public class MyClass {
    public MyClass(int x, int y, Team team) { }
    public MyClass() { }
}

Object arg = new Object[] {2, 2, Game.team[0]};

try {
    Constructor ctor = assignedObject.getClass().getDeclaredConstructor(int.class, int.class, Team.class);
    ctor.setAccessible(true);
    GameObject obj = (GameObject) ctor.newInstance(arg);

} catch (InstantiationException x) {
    x.printStackTrace();
} catch (IllegalAccessException x) {
    x.printStackTrace();
} catch (InvocationTargetException x) {
    x.printStackTrace();
} catch (NoSuchMethodException x) {
    x.printStackTrace();
}

我收到以下错误:

java.lang.IllegalArgumentException: wrong number of arguments

getDeclaredConstructor() 工作并找到我的构造函数与三个 args,但 newInstance(arg) 由于某种原因无法工作,它说“参数数量错误”。知道为什么吗?

【问题讨论】:

标签: java


【解决方案1】:

反射

otherObject = myCar.getClass().newInstance();

假设你的类有一个默认的构造函数。您可以使用非默认(空)构造函数进行更高级的操作

Constructor[] constructors = myCar.getClass().getConstructors();

然后选择你想要的。

请阅读this,了解有关 Java 反射功能的更多详细信息。

【讨论】:

  • 谢谢,有什么办法可以给构造函数传参吗?
  • @lawls 这是一个更高级的话题,here's 如何。当且仅当构造函数接受这些参数时,您需要将参数传递给 Constructor 类的 newInstance() 方法。
  • 它说我必须传递一个带有参数的数组。假设我有两个参数,一个字符串和一个整数。我将如何创建具有不同类型的数组?谢谢。
  • 请看看我更新的问题。我已经提供了我的代码以及我得到的错误。你知道似乎是什么问题吗?谢谢。
  • @SotiriosDelimanolis 啊,现在我记得 - 基元数组将不起作用,因为它不能自动装箱到包装器数组 stackoverflow.com/a/2926653/575659 #3。但是当涉及到对象时,它是显式可变参数还是它们的数组都没有关系。
【解决方案2】:

通过反射。使用这个:

myCar.getClass().newInstance();

【讨论】:

    【解决方案3】:

    关于您的更新/错误 - 看这里:

    public class DupaReflect {
    
        private String name;
        private int id;
    
        private DupaReflect(String name, int id) {
            super();
            this.name = name;
            this.id = id;
        }
    
        @Override
        public String toString() {
            return "DupaReflect [name=" + name + ", id=" + id + "]";
        }
    
        public static void main(String[] args) throws Exception {
            Object[] objects = new Object[] { "asd", 1 };
            DupaReflect dupa = DupaReflect.class.getDeclaredConstructor(String.class, int.class).newInstance(objects);
            System.out.println(dupa);
        }
    
    }
    

    这可以工作并产生所需的输出。 DupaReflect [name=asd, id=1]

    Object[] objects = new Object[]{"asd", 1}; - 这就是我的代码有效而你的无效的原因。

    在您的代码中,您有:

    Object arg = new Object[] {2, 2, Game.team[0]};

    Object[] 在 java 中确实是 Object 的类型,但这会将某些对象的 3 元素数组更改为作为该数组的单个对象。因此,您尝试创建一个新对象,而不是使用 3 个参数,而是使用 1 个参数,因此会引发异常

    解决方案:将您的 Object arg 声明为 Object[] args,一切都应该可以工作。

    【讨论】:

      猜你喜欢
      • 2015-11-17
      • 1970-01-01
      • 2020-06-18
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多