The entry point for all reflection operations is
java.lang.Class. With the exception of
java.lang.reflect.ReflectPermission, none of the classes in
java.lang.reflect
have public constructors. 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
Class.
Object.getClass()
If an instance of an object is available, then the simplest way to get its
Class
is to invoke
Object.getClass(). Of course, this only works for reference types which all inherit from
Object. Some examples follow.
Class c = "foo".getClass();
Returns the
Class
for
String
Class c = System.console().getClass();
There is a unique console associated with the virtual machine which is returned
by the
static method
System.console(). The value returned by
getClass()
is the
Class
corresponding to
java.io.Console.
enum E { A, B }
Class c = A.getClass();
A is is an instance of the enum
E; thus
getClass()
returns the
Class
corresponding to the enumeration type
E.
byte[] bytes = new byte[1024];
Class c = bytes.getClass();
Since arrays are
Objects, it is also possible to invoke
getClass()
on an instance of an array. The returned
Class
corresponds to an array with component type
byte.
import java.util.HashSet;
import java.util.Set;
Set<String> s = new HashSet<String>();
Class c = s.getClass();
In this case,
java.util.Set
is an interface to an object of type
java.util.HashSet. The value returned by
getClass()
is the class corresponding to
java.util.HashSet.
The .class Syntax
If the type is available but there is no instance then it is possible to
obtain a
Class
by appending
".class" to the name of the type. This is also the
easiest way to obtain the
Class
for a primitive type.
boolean b;
Class c = b.getClass(); // compile-time error
Class c = boolean.class; // correct
Note that the statement
boolean.getClass() would produce a
compile-time error because a
boolean is a primitive type and
cannot be dereferenced. The
.class syntax returns the
Class
corresponding to the type
boolean.
Class c = java.io.PrintStream.class;
The variable
c will be the
Class
corresponding to the type
java.io.PrintStream.
Class c = int[][][].class;
The
.class syntax may be used to retrieve a
Class
corresponding to a multi-dimensional array of a given type.
Class.forName()
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");
This statement will create a class from the given fully-qualified name.
Class cDoubleArray = Class.forName("[D");
Class cStringArray = Class.forName("[[Ljava.lang.String;");
The variable
cDoubleArray will contain the
Class
corresponding to an array of primitive type
double (i.e. the same
as
double[].class). The
cStringArray variable will
contain the
Class
corresponding to a two-dimensional array of
String
(i.e. identical to
String[][].class).
TYPE Field for Primitive Type Wrappers
The
.class syntax is a more convenient and the preferred way to
obtain the
Class
for a primitive type; however there is another way to acquire the
Class. Each of the primitive types and
void has a wrapper class in
java.lang
that is used for boxing of primitive types to reference types. Each wrapper
class contains a field named
TYPE which is equal to the
Class
for the primitive type being wrapped.
There is a class
java.lang.Double
which is used to wrap the primitive type
double whenever an
Object
is required. The value of
Double.TYPE
is identical to that of
double.class.
Void.TYPE
is identical to
void.class.
Methods that Return Classes
There are several Reflection APIs which return classes but these may only be
accessed if a
Class
has already been obtained either directly or indirectly.
-
Class.getSuperclass() - Returns the super class for the given class.
Class c = javax.swing.JButton.class.getSuperclass();
The super class of
javax.swing.JButton
is
javax.swing.AbstractButton.
-
Class.getClasses() - Returns all the public classes, interfaces, and enums that are members of
the class including inherited members.
Class<?>[] c = Character.class.getClasses();
Character
contains two member classes
Character.Subset
and
Character.UnicodeBlock.
-
Class.getDeclaredClasses()
- Returns all of the classes interfaces, and enums that are explicitly
declared in this class.
Class<?>[] c = Character.class.getDeclaredClasses();
Character
contains two public member classes
Character.Subset
and
Character.UnicodeBlock
and one private class Character.CharacterCache.
-
{
Class, java.lang.reflect. {
Field,
Method,
Constructor } }.getDeclaringClass()
- Returns the
Class
in which these members were declared.
Anonymous classes
will not have a declaring class but will have an enclosing class.
import java.lang.reflect.Field;
Field f = System.class.getField("out");
Class c = f.getDeclaringClass();
The field
out
is declared in
System.
public class MyClass {
static Object o = new Object() { public void m() {} };
static Class<c> = o.getClass().getEnclosingClass();
}
The declaring class of the anonymous class defined by o is
null.
-
Class.getEnclosingClass() - Returns the immediately enclosing class of the class.
Class c = Thread.State.class().getEnclosingClass();
The enclosing class of the enum
Thread.State
is
Thread.
public class MyClass {
static Object o = new Object() { public void m() {} };
static Class<c> = o.getClass().getEnclosingClass();
}
The anonymous class defined by o is enclosed by
MyClass.