基于参数的新类实例

我正在尝试创建一个函数,它接受扩展Foo的许多类中的一个,并在其类中返回该对象的新实例,而不是Foo的新实例。

我确信这是一个常见的问题。 那里有什么好的例子吗?

我从未使用过类作为输入参数,只使用类的成员。 基于我搜索过的内容,这应该可行吗?

您是将Class对象作为参数传递,还是将其传递给Foo的子类?

在任何一种情况下,解决方案几乎相同,您在Class对象上使用newInstance方法。

 /** * Return a new subclass of the Foo class. */ public Foo fooFactory(Class c) { Foo instance = null; try { instance = c.newInstance(); } catch (InstantiationException e) { // ... } catch (IllegalAccessException e) { // ... } return instance; // which might be null if exception occurred, // or you might want to throw your own exception } 

如果需要构造函数args,可以使用类getConstructor方法,并从那里使用构造函数newInstance(…)方法。

你的function可能是这样的

 public class NewInstanceTest { public static Object getNewInstance(Foo fooObject){ java.lang.Class fooObjectClass = fooObject.getClass(); try { return fooObjectClass.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); return null; } catch (IllegalAccessException e) { e.printStackTrace(); return null; } } public static void main(java.lang.String[] args){ // This prints Foo java.lang.System.out.println(getNewInstance(new Foo()).getClass().getName()); // This prints Foo1 java.lang.System.out.println(getNewInstance(new Foo1()).getClass().getName()); } } class Foo{ } class Foo1 extends Foo{ } 

希望这可以帮助。

看看抽象工厂模式。

您可以在此处使用Java的reflection。

如果您想通过其类名获取Class ,则使用Class.forName

 Class type = Class.forName('package.SomeClass'); 

您可以检查此类是否为Foo或其子类:

 boolean isFoo = type.isAssignableFrom(Foo.class); 

然后,您可以非常轻松地创建一个新实例(假设构造函数不带参数):

 Object instance = type.newInstance();