SpiRail
SpiRail

Reputation: 1415

New instance of class based on argument

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 Foo.

I'm sure this is a common issue. Is there any good examples out there?

I have never used a class as an input parameter, only members of a class. Based on what I have searched for, this should be possible to do?

Upvotes: 0

Views: 2015

Answers (4)

Stephen P
Stephen P

Reputation: 14800

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.

Upvotes: 1

mishadoff
mishadoff

Reputation: 10789

Look at Abstract Factory pattern.

Upvotes: 1

Ravindra Gullapalli
Ravindra Gullapalli

Reputation: 9158

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.

Upvotes: 1

fivedigit
fivedigit

Reputation: 18682

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

Upvotes: 0

Related Questions