我有一个关于从作为方法参数传递的一类在Java中实例化一个新的对象的查询,例如:实例化一个类,在java中传递?
void myMethod(Class aReceived){
object = new aReceived // object will be a superclass of aReceived
}
我看到这个用客观-C做的几行,但我不确定它在java中如何工作。
你能帮忙吗?
在此先感谢;)
我有一个关于从作为方法参数传递的一类在Java中实例化一个新的对象的查询,例如:实例化一个类,在java中传递?
void myMethod(Class aReceived){
object = new aReceived // object will be a superclass of aReceived
}
我看到这个用客观-C做的几行,但我不确定它在java中如何工作。
你能帮忙吗?
在此先感谢;)
如果你想通过无参数的构造函数来创建一个对象:
void myMethod(Class<?> aReceived) {
Object newObject = aReceived.newInstance();
...
}
如果你想创建通过两个参数的构造函数的对象(以字符串,INT):
void myMethod(Class<?> aReceived) {
Object newObject = aReceived.getConstructor(String.class, int.class)
.newInstance("aaa", 222);
...
}
最后,可以使用泛型适当地设定newObject
变量(的类型上的任一上述片段的)顶部:
void myMethod(Class<T> aReceived) {
T newObject = aReceived.getConstructor(String.class, int.class)
.newInstance("aaa", 222);
...
// Sadly, due to erasure of generics you cannot do newObject.SomeMethodOfT()
// because T is effectively erased to Object. You can only invoke the
// methods of Object and/or use refelection to dynamically manipulate newObject
}
[附录]
你怎么称呼这种方法吗?
选项1 - 当你知道,在代码编写的时候,你想传递给方法是什么类:
myMethod(TestClass.class)
选项2 - 当被实例化的类的名字只能根据已知情况运行时,作为一个字符串:
String className = ....; // Name of class to be instantiated
myMethod(Class.forName(className));
Class
有一个方法就可以了叫newInstance
用于创建类的实例。你也可以看看整个java.lang.reflect
package。
object = aReceived.newInstance();
这假定该类有一个无参数构造函数。
如果你只有一个默认的构造函数,你可以做这样的事情:
aReceived.newInstance();
如果你需要传递参数,你不能使用此方法。但是,您可以在确定哪一个是正确的构造函数的情况下进行管理,例如getConstructor(Class<?> parameterTypes ...)
如果你想传递一个字符串作为唯一参数,你可以这样做:
Constructor ctor = aReceived.getConstructor(String.class);
object = ctor.newInstance("somestring");
我已经使用了aReceived.newInstance();最初我收到了这样的错误:未报告的异常java.lang.InstantiationException;必须被捕获或宣布被抛出。我通过在myMethod声明末尾添加'throws Exception'来解决这个问题,该问题似乎已经清理完毕。然而,我现在无法调用该方法:尝试使用myMethod(testClass); testClass是我在代码中定义的一个。有任何想法吗?再次感谢您的帮助;) – eJm 2011-12-16 19:13:25
在下面的答案中增加了另一节来解决您所描述的问题。 – 2011-12-16 23:35:07