New instance of class based on argument

后端 未结 4 419
时光说笑
时光说笑 2021-01-26 15:23

I\'m trying to make a function that takes one of many classes that extends Foo, and return a new instance of that object in its Class, not a new instance of F

相关标签:
4条回答
  • 2021-01-26 15:25

    You can use Java's reflection here.

    If you want to get a Class by just its classname, you use Class.forName:

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

    You can check if this class is Foo or a subclass of it:

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

    You can then create a new instance very easily (assuming the constructor takes no arguments):

    Object instance = type.newInstance();
    
    0 讨论(0)
  • 2021-01-26 15:26

    Are you passing a Class object as the parameter, or in instance of a subclass of Foo?

    The solution is almost the same in either case, you use the newInstance method on the Class object.

    /**
     * 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
    }
    

    If you need constructor args you can use the Class getConstructor method and from there the Constructor newInstance(...) method.

    0 讨论(0)
  • 2021-01-26 15:28

    Look at Abstract Factory pattern.

    0 讨论(0)
  • 2021-01-26 15:45

    Your function could be like this

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

    Hope this helps.

    0 讨论(0)
提交回复
热议问题