|
Spec-Zone .ru
спецификации, руководства, описания, API
|
The entry point for all reflection operations is
java.lang.Class. With the exception of
, none of the classes in
have public constructors. To get to these classes, it is necessary to invoke appropriate methods on
. There are several ways to get a
depending on whether the code has access to an object, the name of class, a type, or an existing
.
If an instance of an object is available, then the simplest way to get its is to invoke . Of course, this only works for reference types which all inherit from . Some examples follow.
Class c = "foo".getClass();
Returns the for
Class c = System.console().getClass();
There is a unique console associated with the virtual machine which is returned by the static method
. The value returned by
is the
corresponding to
.
enum E { A, B }
Class c = A.getClass();
A is is an instance of the enum E; thus
returns the
corresponding to the enumeration type E.
byte[] bytes = new byte[1024]; Class c = bytes.getClass();
Since arrays are
, it is also possible to invoke
on an instance of an array. The returned
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, is an interface to an object of type . The value returned by is the class corresponding to .
If the type is available but there is no instance then it is possible to obtain a
by appending ".class" to the name of the type. This is also the easiest way to obtain the
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
corresponding to the type boolean.
Class c = java.io.PrintStream.class;
The variable c will be the
corresponding to the type
.
Class c = int[][][].class;
The .class syntax may be used to retrieve a
corresponding to a multi-dimensional array of a given type.
If the fully-qualified name of a class is available, it is possible to get the corresponding using the static method . This cannot be used for primitive types. The syntax for names of array classes is described by . 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
corresponding to an array of primitive type double (i.e. the same as double[].class). The cStringArray variable will contain the
corresponding to a two-dimensional array of
(i.e. identical to String[][].class).
The .class syntax is a more convenient and the preferred way to obtain the
for a primitive type; however there is another way to acquire the
. Each of the primitive types and void has a wrapper class in
that is used for boxing of primitive types to reference types. Each wrapper class contains a field named TYPE which is equal to the
for the primitive type being wrapped.
Class c = Double.TYPE;
There is a class
which is used to wrap the primitive type double whenever an
is required. The value of
is identical to that of double.class.
Class c = Void.TYPE;
is identical to void.class.
There are several Reflection APIs which return classes but these may only be accessed if a has already been obtained either directly or indirectly.
Class c = javax.swing.JButton.class.getSuperclass();
Class<?>[] c = Character.class.getClasses();
Class<?>[] c = Character.class.getDeclaredClasses();
Character.CharacterCache.
import java.lang.reflect.Field;
Field f = System.class.getField("out");
Class c = f.getDeclaringClass();
public class MyClass {
static Object o = new Object() {
public void m() {}
};
static Class<c> = o.getClass().getEnclosingClass();
}
o is null.Class c = Thread.State.class().getEnclosingClass();
public class MyClass {
static Object o = new Object() {
public void m() {}
};
static Class<c> = o.getClass().getEnclosingClass();
}
o is enclosed by MyClass.