使用类类的一个对象来创建一个新的实例
我打电话与签名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;
。
为了实现线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
。
总之,你需要确保用户参数将有什么样的构造函数,否则你会碰到麻烦。
不过,我相信这个回答你的问题。
我接受了你的答案,因为你试过了,其他人不理解我的问题(我的错)。位仍然无法'用newUser访问类用户的公共方法,编译器仍然只显示了Object类型的方法。不管怎么说,还是要谢谢你。 – Martin
这是因为它不知道'T'具有什么方法,因为它可能是任何对象。解决方法是用所有用户类共用的方法创建一个接口,然后确保它们全部实现该接口,并将'public
我认为你会传递不同类的对象,而不仅仅是所有的'User'类,对吗?否则,这是所有的顶部,你可以没有泛型。 –
呼唤,你需要在类中的方法newInstance()
?它会为new User()
编辑同样的效果:我不明白你的问题为好,但我认为我是对的
如果我理解正确的话,你想使用它的类实例化一个类目的?
您可以获取类可用的构造函数通过Class.getConstructors,然后调用其中的任何与Constructor.newInstance,通过你的参数。
你的问题到底是什么? – rmlan
您通常会传入'Class',以便测试演员是否成功;或者,您可以使用'instanceof'。你能提供更多关于你如何加载**的内容吗?你保存的“Object”(s)? –
你问:“我如何使用反射实例化一个对象”? – Siguza