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.TYPEc=String.class;// Same as "a string".getClass() ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access