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
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();
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.
Look at Abstract Factory pattern.
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.