Java 基于参数的类的新实例

Java 基于参数的类的新实例,java,Java,我试图创建一个函数,它接受扩展Foo的许多类中的一个,并在其类中返回该对象的新实例,而不是Foo的新实例 我相信这是一个普遍的问题。有什么好的例子吗 我从未将类用作输入参数,仅使用类的成员。根据我搜索的内容,这应该是可能的?您可以在这里使用Java的反射 如果您只想通过类名获得类,可以使用Class.forName: Class type = Class.forName('package.SomeClass'); 您可以检查此类是Foo还是其子类: boolean isFoo = type.i

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

我相信这是一个普遍的问题。有什么好的例子吗


我从未将类用作输入参数,仅使用类的成员。根据我搜索的内容,这应该是可能的?

您可以在这里使用Java的反射

如果您只想通过类名获得
,可以使用
Class.forName

Class type = Class.forName('package.SomeClass');
您可以检查此类是
Foo
还是其子类:

boolean isFoo = type.isAssignableFrom(Foo.class);
然后可以非常轻松地创建一个新实例(假设构造函数不带参数):


您可以在这里使用Java的反射

如果您只想通过类名获得
,可以使用
Class.forName

Class type = Class.forName('package.SomeClass');
您可以检查此类是
Foo
还是其子类:

boolean isFoo = type.isAssignableFrom(Foo.class);
然后可以非常轻松地创建一个新实例(假设构造函数不带参数):


您是将
对象作为参数传递,还是在
Foo
子类的实例中传递

在这两种情况下,解决方案几乎是相同的,在类对象上使用该方法

/**
 * 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
}
/**
*返回Foo类的新子类。
*/

public Foo fooFactory(Class您是将
对象作为参数传递,还是在
Foo
子类的实例中传递

在这两种情况下,解决方案几乎是相同的,在类对象上使用该方法

/**
 * 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
}
/**
*返回Foo类的新子类。
*/

publicfoofactory(Class您的函数可以是这样的

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{
}

希望这能有所帮助。

您的函数可以是这样的

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{
}

希望这有帮助。

查看模式。

查看模式。

谢谢mate…现在似乎正在工作。对于其他阅读,在此之后我得到了一个异常并用此线程解决:谢谢mate…现在似乎正在工作。对于其他阅读,在此之后我得到了一个异常并用此线程解决: