基于参数的新类实例
我正在尝试创建一个函数,它接受扩展Foo
的许多类中的一个,并在其类中返回该对象的新实例,而不是Foo
的新实例。
我确信这是一个常见的问题。 那里有什么好的例子吗?
我从未使用过类作为输入参数,只使用类的成员。 基于我搜索过的内容,这应该可行吗?
您是将Class
对象作为参数传递,还是将其传递给Foo
的子类?
在任何一种情况下,解决方案几乎相同,您在Class对象上使用newInstance方法。
/** * Return a new subclass of the Foo class. */ public Foo fooFactory(Class extends Foo> 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();