使用对象的类类型来创建新实例

时间:2016-05-13 12:18:35

标签: java

我用这种方式调用签名为save(Object o)的方法:

EntityManager em = new EntityManager(); // My own EntityManager
User user = new User(); // Constructor provides values
em.save(user);

在save-method中我需要实例化一个新对象,在这种情况下,它将是User类型:User user = (User) o;

好吧,到目前为止,我可以使用o.getClass()提取对象的类,它提供class org.example.User,我猜是User.class。但我无法弄清楚如何用这个来实现User user = (User) o;行。

3 个答案:

答案 0 :(得分:1)

要在Clazz user = (Clazz) o;方法中实现行save,其中Clazz是传递给save方法的对象的类,所以在这种情况下User,您可以在save的签名中使用泛型,如下所示:

public <T> void save(T user) throws IllegalAccessException, InstantiationException, InvocationTargetException {
    int i = 0;
    List<Object> args = new ArrayList<>();
    args.add(0,"Example");
    T newUser = (T)user.getClass().getConstructors()[i].newInstance(args);
    // Exciting things...
}

请注意,newUser的类型是从传递给方法的对象类型推断出来的,并且您需要知道期望将哪些对象传递给该类型的构造函数,以创建args数组,否则将抛出异常。类似地,您需要知道数组中构造函数的位置,以便设置i

简而言之,您需要确定用户参数将具有哪种构造函数,否则您将遇到麻烦。

但是,我相信这会回答你的问题。

答案 1 :(得分:0)

在Class上调用方法newInstance()吗?它将与new User()

具有相同的效果

编辑:我也不理解你的问题,但我认为我是对的

答案 2 :(得分:0)

如果我理解正确,你试图使用它的类对象来实例化一个类?

你可以上课#39; 可用构造函数通过Class.getConstructors,然后使用Constructor.newInstance调用其中任何一个,并传递参数。