2011-12-16 66 views
1

我有一个关于从作为方法参数传递的一类在Java中实例化一个新的对象的查询,例如:实例化一个类,在java中传递?

void myMethod(Class aReceived){ 
    object = new aReceived  // object will be a superclass of aReceived 
} 

我看到这个用客观-C做的几行,但我不确定它在java中如何工作。

你能帮忙吗?

在此先感谢;)

+0

我已经使用了aReceived.newInstance();最初我收到了这样的错误:未报告的异常java.lang.InstantiationException;必须被捕获或宣布被抛出。我通过在myMethod声明末尾添加'throws Exception'来解决这个问题,该问题似乎已经清理完毕。然而,我现在无法调用该方法:尝试使用myMethod(testClass); testClass是我在代码中定义的一个。有任何想法吗?再次感谢您的帮助;) – eJm 2011-12-16 19:13:25

+0

在下面的答案中增加了另一节来解决您所描述的问题。 – 2011-12-16 23:35:07

回答

5

如果你想通过无参数的构造函数来创建一个对象:

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)); 
3
object = aReceived.newInstance(); 

这假定该类有一个无参数构造函数。

1

如果你只有一个默认的构造函数,你可以做这样的事情:

aReceived.newInstance(); 

如果你需要传递参数,你不能使用此方法。但是,您可以在确定哪一个是正确的构造函数的情况下进行管理,例如getConstructor(Class<?> parameterTypes ...)

如果你想传递一个字符串作为唯一参数,你可以这样做:

Constructor ctor = aReceived.getConstructor(String.class); 
object = ctor.newInstance("somestring");