如何通过隐式默认构造方法动态实例化作为参数传入的Java类对象
Java动态实例化无显式构造方法类的问题及解决
我当前遇到的场景是:需要实例化一个作为参数传入的类的对象,且对象属性要初始化为默认值(比如null)。要实例化的类没有任何显式构造方法,并且由于多种原因无法为其添加构造方法。这些可能用到的类也没有共同的父类,都是Object的直接子类。待实例化的类示例如下:
public class MyClass { public String prop1; public int prop2; public int prop3; }
也就是说这些类仅包含属性、没有方法,因此也没有显式构造方法。当提前知道具体类的时候,当然可以这么实现:
public MyClass create() { return new MyClass(); }
上述场景中,编译器会为MyClass生成默认构造方法,并将所有属性初始化为对应默认值。正如相关说明指出的,这意味着技术上这个类是有构造方法的,但只能在提前知道类的前提下通过new关键字调用它。现在想要实现的逻辑大致如下:
public someClass create(Class<?> someClass) { return new someClass(); }
显然这种场景下直接用new关键字是行不通的,已经尝试了多种方案,目前全都没有成功:
- 使用
someClass.getConstructor().newInstance()或者someClass.getDeclaredConstructor().newInstance()。代码可以编译,但会抛出"NoSuchMethodException",因为程序找不到someClass对应的<init>方法或者构造方法 - 从Object进行类型转换,比如
Object newObject = someClass.cast(new Object())。不出所料也会报错,因为无法将父类强制转换为子类
由于可能用到的类数量不多,目前唯一的可行方案是写一个庞大的switch-case分支,对每个类用instanceof判断,每个分支里用new关键字实例化对应对象。但显然并不想采用这种方案。
所以想做的事情是不可能实现的吗?还是说有其他可行的方案?
解决方案
事实证明第一种方法是完全可行的,之前报错只是因为没有意识到传入的部分Class对象是数组类。如果传入数组中实际存储的对象的类,该方法就可以正常运行。问题完全出在操作失误上。
内容的提问来源于stack exchange,提问作者Simon Weiler
相关产品推荐
相关产品推荐

