我正在尝试创建一个函数,它接受扩展Foo
的许多类中的一个,并在其类中返回该对象的新实例,而不是Foo
的新实例。
我确信这是一个常见问题。那里有什么好的例子吗?
我从未使用过类作为输入参数,只使用类的成员。基于我搜索过的内容,应该可以这样做吗?
答案 0 :(得分:1)
您是在传递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(...)方法。
答案 1 :(得分:1)
你的功能可能是这样的
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{
}
希望这有帮助。
答案 2 :(得分:1)
查看Abstract Factory模式。
答案 3 :(得分:0)
你可以在这里使用Java的反思。
如果您想通过其类名获得Class
,请使用Class.forName
:
Class type = Class.forName('package.SomeClass');
您可以检查此类是Foo
还是其子类:
boolean isFoo = type.isAssignableFrom(Foo.class);
然后,您可以非常轻松地创建一个新实例(假设构造函数不带参数):
Object instance = type.newInstance();