Search code examples
javaclassnew-operator

instantiate class from class object


In java, can I use a class object to dynamically instantiate classes of that type?

i.e. I want some function like this.

Object foo(Class type) {
    // return new object of type 'type'
}

Solution

  • In Java 9 and afterward, if there's a declared zero-parameter ("nullary") constructor, you'd use Class.getDeclaredConstructor() to get it, then call newInstance() on it:

    Object foo(Class type) throws InstantiationException, IllegalAccessException, InvocationTargetException {
        return type.getDeclaredConstructor().newInstance();
    }
    

    Prior to Java 9, you would have used Class.newInstance:

    Object foo(Class type) throws InstantiationException, IllegalAccessException {
        return type.newInstance();
    }
    

    ...but it was deprecated as of Java 9 because it threw any exception thrown by the constructor, even checked exceptions, but didn't (of course) declare those checked exceptions, effectively bypassing compile-time checked exception handling. Constructor.newInstance wraps exceptions from the constructor in InvocationTargetException instead.

    Both of the above assume there's a zero-parameter constructor. A more robust route is to go through Class.getDeclaredConstructors or Class.getConstructors, which takes you into using the Reflection stuff in the java.lang.reflect package, to find a constructor with the parameter types matching the arguments you intend to give it.