有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

基于参数的类的java新实例

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

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

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


共 (4) 个答案

  1. # 2 楼答案

    你的函数可以是这样的

    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. # 3 楼答案

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

    在这两种情况下,解决方案几乎是相同的,在类对象上使用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
    }
    

    如果需要构造函数参数,可以使用类getConstructor方法,然后使用构造函数newInstance(...)方法

  3. # 4 楼答案

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

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

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

    您可以检查该类是Foo还是它的子类:

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

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

    Object instance = type.newInstance();