and Method Handles
R e l e c t i o n
In Chapter 3 , we met Java's Class objects, as a way of representing a live type in a
running Java process. In this chapter, we will build on this foundation to discuss
how the Java environment loads and makes new types available. In the second half
of the chapter, we will introduce Java's introspection capabilities—both the original
Reflection API and the newer Method Handles capabilities.
Class Files, Class Objects, and Metadata
Class files, as we saw in Chapter 1 , are the result of compiling Java source files (or,
potentially, other languages) into the intermediate form used by the JVM. These are
binary files that are not designed to be human readable.
The runtime representation of these class files are the class objects that contain met‐
adata, which represents the Java type that the class file was created from.
Examples of Class Objects
You can obtain a class object in Java in several ways. The simplest is:
Class <?> myCl = getClass ();
This returns the class object of the instance that it is called from. However, as we
know from our survey of the public methods of Object , the getClass() method on
Object is public, so we can also obtain the class of an arbitrary object o :
Class <?> c = o . getClass ();
Class objects for known types can also be written as “class literals”: