An application may make use of external, user-defined classes by creating instances of extensibility objects using their fully-qualified names.
Class Browsers and Visual Development Environments
A class browser needs to be able to enumerate the members of classes. Visual development environments can benefit from making use of type information available in reflection to aid the developer in writing correct code.
Debuggers and Test Tools
Debuggers need to be able to examine private members on classes. Test harnesses can make use of reflection to systematically call a discoverable set APIs defined on a class, to insure a high level of code coverage in a test suite.
Every type is either a reference or a primitive. Classes, enums, and arrays (which all inherit from
java.lang.Object) as well as interfaces are all reference types. Examples of reference types include
java.lang.String, all of the wrapper classes for primitive types such as
java.lang.Double, the interface
java.io.Serializable, and the enum
There is a fixed set of primitive types:
For every type of object, the Java virtual machine instantiates an immutable instance of
java.lang.Class which provides methods to examine the runtime properties of the object including its members and type information.
Class also provides the ability to create new classes and objects. Most importantly, it is the entry point for all of the Reflection APIs. This lesson covers the most commonly used reflection operations involving classes:
Retrieving Class Objects
The entry point for all reflection operations is
java.lang.Class. To get to these classes, it is necessary to invoke appropriate methods on
Class. There are several ways to get a
Class depending on whether the code has access to an object, the name of class, a type, or an existing
If the fully-qualified name of a class is available, it is possible to get the corresponding
Class using the static method
Class.forName(). This cannot be used for primitive types. The syntax for names of array classes is described by
Class.getName(). This syntax is applicable to references and primitive types.
Class c = Class.forName("com.duke.MyLocaleServiceProvider");