Java Reference
In-Depth Information
// 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()
c
=
byte
[].
class
;
// Type of byte arrays
For primitive types and
void
, we also have class objects that are represented as liter‐
als:
// Obtain a Class object for primitive types with various
// predefined constants
c
=
Void
.
TYPE
;
// The special "no-return-value" type
c
=
Byte
.
TYPE
;
// Class object that represents a byte
c
=
Integer
.
TYPE
;
// Class object that represents an int
c
=
Double
.
TYPE
;
// etc; see also Short, Character, Long, Float
For unknown types, we will have to use more sophisticated methods.
Class Objects and Metadata
The class objects contain metadata about the given type. This includes the methods,
fields, constructors, etc. that are defined on the class in question. This metadata can
be accessed by the programmer to investigate the class, even if nothing is known
about the class when it is loaded.
For example, we can find all the deprecated methods in the class file (they will be
marked with the
@Deprecated
annotation):
Class
<?>
clz
=
getClassFromDisk
();
for
(
Method
m
:
clz
.
getMethods
())
{
for
(
Annotation
a
:
m
.
getAnnotations
())
{
if
(
a
.
annotationType
()
==
Deprecated
.
class
)
{
System
.
out
.
println
(
m
.
getName
());
}
}
}
We could also find the common ancestor class of a pair of class files. This simple
form will work when both classes have been loaded by the same classloader:
public
static
Class
<?>
commonAncestor
(
Class
<?>
cl1
,
Class
<?>
cl2
)
{
if
(
cl1
==
null
||
cl2
==
null
)
return
null
;
if
(
cl1
.
equals
(
cl2
))
return
cl1
;
if
(
cl1
.
isPrimitive
()
||
cl2
.
isPrimitive
())
return
null
;
List
<
Class
<?>>
ancestors
=
new
ArrayList
<>();
Class
<?>
c
=
cl1
;
while
(!
c
.
equals
(
Object
.
class
))
{
if
(
c
.
equals
(
cl2
))
return
c
;
ancestors
.
add
(
c
);
c
=
c
.
getSuperclass
();
}
c
=
cl2
;
while
(!
c
.
equals
(
Object
.
class
))
{