Chapter 11. Classloading, Reflection, and Method Handles

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 metadata, 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”:

// Express a class literal as a type name followed by ".class"
c = int.class; // Same as Integer.TYPE
c = String.class; // Same as "a string".getClass() ...

Get Java in a Nutshell, 6th Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.