我用这种方式调用签名为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;
行。
答案 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调用其中任何一个,并传递参数。