What is the difference between Class.forName and Class.forName.newInstance?
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.
Java Class Loading and Instantiation
In Java, handling classes dynamically during runtime is a powerful capability, allowing developers to load and use classes even if they were not known at compile time. Two common methods associated with this process are Class.forName() and Class.forName().newInstance(). This article delves into the differences between these two methods, their use cases, and technical nuances.
Understanding Class.forName()
Class.forName() is a method provided by the Java Class class. Its primary purpose is to load a class into memory using the fully qualified class name. This method returns a Class object that represents the loaded class.
- Usage:
Class.forName("com.example.MyClass"); - Purpose: Only loads the class into memory, if not already loaded.
- Side Effects: Triggers static initializers within the class.
Technical Explanation
When you call Class.forName():
- The class loader is instructed to load the specified class into memory.
- The method checks if the class is already loaded; if not, it's loaded and linked.
- Class initialization happens, which includes the execution of static blocks and static variable initializations.
Understanding Class.forName().newInstance()
Class.forName().newInstance() combines the loading of a class with creating an instance of it. It first ensures the class is loaded as per Class.forName(), then creates a new instance using the no-argument constructor.
- Usage:
MyClass obj = (MyClass) Class.forName("com.example.MyClass").newInstance(); - Purpose: Instantiates an object of the class once it is loaded.
- Side Effects: Requires a public no-argument constructor for the class being instantiated.
Technical Explanation
When you call newInstance():
- It checks if the class is already loaded.
- If loaded, it tries to create a new instance using the default constructor.
- If there is no accessible no-argument constructor, an
InstantiationExceptionorIllegalAccessExceptionis thrown.
Example
Using Class.forName()
Using Class.forName().newInstance()
Key Differences and Considerations
To understand at a glance, refer to the following table:
| Aspect | Class.forName() | Class.forName().newInstance() |
| Purpose | Load a class | Load and instantiate a class |
| Method Returns | Class object | Object instance of the specified class |
| Static Initialization | Triggered | Triggered |
| Instance Creation | No | Yes |
| Constructor Requirement | None | Public no-argument constructor required |
| Common Exceptions | ClassNotFoundException | InstantiationException, IllegalAccessException |
Subtopics
1. Alternatives in Modern Java
Since Java 9, Class.newInstance() is deprecated. The recommended approach is to use Constructor.newInstance() which provides better reflection capabilities and allows you to specify constructor arguments.
2. Security Considerations
Using reflection can introduce security vulnerabilities. Always ensure that dynamically-loaded classes are properly vetted and tested, especially in environments where inputs are taken from untrusted sources.
3. Performance Considerations
Reflection is generally slower than regular method invocations. It should be used judiciously and only when dynamic behavior is necessary.
Conclusion
Class.forName() and Class.forName().newInstance() are essential tools for Java developers dealing with dynamic class loading and instantiation. Understanding the differences between these methods, their use cases, and their implications is key to leveraging Java’s reflective capabilities effectively and securely. As Java evolves, be mindful of newer practices and methods that improve upon these foundational techniques.
Related reading
- What is the difference between Class.getResource and ClassLoader.getResource?
- What is the difference between Collection and List in Java?
- What is the difference between ComponentScan and EnableAutoConfiguration in Spring Boot?
- What is the difference between DistributedCache.getCacheFiles() and DistributedCache.getLocalCacheFiles()
- What is the difference between ''E'', ''T'', and ''?'' for Java generics?
- What is the difference between Enum.name and Enum.toString?
- What is the difference between ExecutorService.submit and ExecutorService.execute in this code in Java?
- What is the difference between ExtendWithSpringExtension.class and ExtendWithMockitoExtension.class?

OOD Fundamentals
Master object-oriented design from first principles, SOLID, design patterns, and classic interview problems with hands-on coding.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.