基于参数的新类实例

时间:2012-01-28 01:52:03

标签: java

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

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

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

4 个答案:

答案 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();