2016-05-13 73 views
-4

我打电话与签名save(Object o)的方法是这样的:使用类类的一个对象来创建一个新的实例

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

在保存法,我需要实例化一个新的对象,在这种情况下,将类型User这样的:User user = (User) o;

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

+3

你的问题到底是什么? – rmlan

+0

您通常会传入'Class',以便测试演员是否成功;或者,您可以使用'instanceof'。你能提供更多关于你如何加载**的内容吗?你保存的“Object”(s)? –

+0

你问:“我如何使用反射实例化一个对象”? – Siguza

回答

1

为了实现线Clazz user = (Clazz) o;,在save方法,其中Clazz是类传递到保存方法的对象的,所以在这种情况下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

总之,你需要确保用户参数将有什么样的构造函数,否则你会碰到麻烦。

不过,我相信这个回答你的问题。

+0

我接受了你的答案,因为你试过了,其他人不理解我的问题(我的错)。位仍然无法'用newUser访问类用户的公共方法,编译器仍然只显示了Object类型的方法。不管怎么说,还是要谢谢你。 – Martin

+0

这是因为它不知道'T'具有什么方法,因为它可能是任何对象。解决方法是用所有用户类共用的方法创建一个接口,然后确保它们全部实现该接口,并将'public '更改为'public '。这样UserInterface的方法将被暴露。 –

+0

我认为你会传递不同类的对象,而不仅仅是所有的'User'类,对吗?否则,这是所有的顶部,你可以没有泛型。 –

0

呼唤,你需要在类中的方法newInstance()?它会为new User()

编辑同样的效果:我不明白你的问题为好,但我认为我是对的

相关问题