实例化一个类,传入java?

时间:2011-12-16 10:14:19

标签: java objective-c instantiation

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

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

我已经在几行中使用Objective-C看到了这一点,但不确定它在java中是如何工作的。

你可以帮忙吗?

提前致谢;)

4 个答案:

答案 0 :(得分:5)

如果要通过no-arg构造函数创建对象:

void myMethod(Class<?> aReceived) {
  Object newObject = aReceived.newInstance();
  ...
}

如果要通过双arg构造函数创建对象(使用String,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));

答案 1 :(得分:3)

Class上有一个名为newInstance的方法,用于创建该类的实例。您也可以查看整个java.lang.reflect package

答案 2 :(得分:3)

object = aReceived.newInstance();

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

答案 3 :(得分:1)

如果您只有默认构造函数,则可以执行以下操作:

aReceived.newInstance();

如果您需要传递参数,则无法使用此方法。但是你可以在确定哪个是getConstructor(Class<?> parameterTypes ...)

的正确构造函数的同时管理它

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

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