Java Top

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

> CHECK OUT THE COURSE

1. Overview

The Class class plays a significant role in Java reflection, as it's the entry point of all reflection operations.

In this quick tutorial, we'll explore how to get the Class object from a class name in a string.

2. Introduction to the Problem

First of all, let's create a simple class as an example:

package com.baeldung.getclassfromstr;

public class MyNiceClass {
    public String greeting(){
        return "Hi there, I wish you all the best!";
    }
}

As the code above shows, the MyNiceClass class is created in the package com.baeldung.getclassfromstr. Also, the class has only one method, greeting(), which returns a String.

Our goal is to get the Class object of the MyNiceClass class from its name. Further, we'd like to create a MyNiceClass‘s instance from the Class object to verify whether the Class object is the one we're after.

For simplicity, we'll use unit test assertions to verify if our solution works as expected.

Next, let's see it in action.

3. Using the forName() Method to Get the Class Object

The Class class provides the forName() method to get the Class object from a class name as a string. Next, let's see how to call the method to get the Class object of MyNiceClass:

Class cls = Class.forName("com.baeldung.getclassfromstr.MyNiceClass");
assertNotNull(cls);

Next, let's create a MyNiceClass instance from the Class object cls. If our Java version is older than 9, we can get an instance using the cls.newInstance() method. However, this method has been deprecated since Java 9. For the newer Java version, we can use cls.getDeclaredConstructor().newInstance() to obtain a new instance from the Class object:

MyNiceClass myNiceObject = (MyNiceClass) cls.getDeclaredConstructor().newInstance();
assertNotNull(myNiceObject);
assertEquals("Hi there, I wish you all the best!", myNiceObject.greeting());

The test passes when we give it a run. Therefore, we've got the desired Class object from the class name.

It's worth mentioning that, to get the Class object, we must pass a qualified class name instead of a simple name to the forName() method. For example, we should pass the string “com.baeldung.getclassfromstr.MyNiceClass” to the forName() method. Otherwise, the forName() method throws ClassNotFoundException:

assertThrows(ClassNotFoundException.class, () -> Class.forName("MyNiceClass"));

4. A Few Words About the Exception Handling

We've seen how to get MyNiceClass‘s Class object from its class name. For simplicity, we've omitted the exception handling in the test. Now, let's look at which exceptions we should handle when we use the Class.forName() and the cls.getDeclaredConstructor().newInstance() methods.

First, Class.forName() throws ClassNotFoundException. We mentioned it when we passed MyNiceClass‘s simple name to it. ClassNotFoundException is a checked exception. Therefore, we must handle it when invoking the Class.forName() method.

Next, let's look at cls.getDeclaredConstructor() and newInstance(). The getDeclaredConstructor() method throws NoSuchMethodException. Also, newInstance() throws InstantiationException, IllegalAccessException, IllegalArgumentException, and InvocationTargetException. All these five exceptions are checked exceptions. So, we need to handle them if we use these two methods.

It's worth mentioning that all exceptions we've talked about in this section are subtypes of ReflectiveOperationException. That's to say, if we don't want to handle those exceptions individually, we can handle ReflectiveOperationException, for example:

void someNiceMethod() throws ReflectiveOperationException {
    Class cls = Class.forName("com.baeldung.getclassfromstr.MyNiceClass");
    MyNiceClass myNiceObject = (MyNiceClass) cls.getDeclaredConstructor().newInstance();
    // ...
}

Or, we can use the try-catch block:

try {
    Class cls = Class.forName("com.baeldung.getclassfromstr.MyNiceClass");
    MyNiceClass myNiceObject = (MyNiceClass) cls.getDeclaredConstructor().newInstance();
    // ...
} catch (ReflectiveOperationException exception) {
    // handle the exception
}

5. Conclusion

In this short article, we've learned to use the Class.forName() method to obtain the Class object from a given class name string. We should note that we should pass the qualified name to the Class.forName() method.

As always, all code examples used in this article can be found over on GitHub.

Java bottom

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE
Generic footer banner
guest
0 Comments
Inline Feedbacks
View all comments