Download PPT

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Java reflections API
Lecture 1
1
Assignments

Java 1.4 or Java 1.5?
• Both are ok, but the assignments are written
for Java 1.4, and specific Java 1.5 support
may not be prioritized.
2
Run-time introspection






If you are writing a class browser, debug system, IDE
environment (Eclipse).
Discover which methods/constructors are available in
an object or class.
Discover attributes/fields
Discover super classes and implemented interfaces
Instantiate objects from class name
And more…
3
Getting the “Class object”


Taste on it… confused?
An object that represents a class…
•
•
•
For each class, the Java Runtime Environment (JRE)
maintains an immutable Class object that contains
information about the class.
A Class object represents, or reflects, the class.
Class objects not only represent classes but also
interfaces.
4
Confusion continued…
5
Examples


If an instance of the class is available…
• Class
c = mystery.getClass();
retrieve the Class object for the superclass
• TextField
t = new TextField();
Class c = t.getClass();
Class s = c.getSuperclass();


If you know the name of the class at compile time,
• Class
c = java.awt.Button.class;
If the class name is unknown at compile time, but
available at runtime
• Class
c = Class.forName(strg);
6
Getting the Class Name

import java.awt.Button;
class SampleName {
public static void main(String[] args) {
Button b = new Button();
printName(b);
}
static void printName(Object o) {
Class c = o.getClass();
String s = c.getName();
System.out.println(s);
}

}
What will be printed?
7
Discovering Class Modifiers



public final class Coordinate {int x, int y, int z}
class SampleModifier {
public static void main(String[] args) {
String s = new String();
printModifiers(s);
}
public static void printModifiers(Object o) {
Class c = o.getClass();
int m = c.getModifiers();
if (Modifier.isPublic(m))
System.out.println("public");
if (Modifier.isAbstract(m))
System.out.println("abstract");
if (Modifier.isFinal(m))
System.out.println("final");
}
}
Output?
8
Finding the superclass

To determine the superclass of a class,
you invoke the getSuperclass method.
• This method returns a Class object
representing the superclass, or returns null if
the class has no superclass. To identify all
ancestors of a class, call getSuperclass
iteratively until it returns null.
9
Example

import java.lang.reflect.*;
import java.awt.*;
class SampleSuper {
public static void main(String[] args) {
Button b = new Button();
printSuperclasses(b);
}
}
static void printSuperclasses(Object o) {
Class subclass = o.getClass();
Class superclass = subclass.getSuperclass();
while (superclass != null) {
String className = superclass.getName();
System.out.println(className);
subclass = superclass;
superclass = subclass.getSuperclass();
}
}
10
Interfaces

An interface is similar to a superclass
and is thus as important as such. The
class below implements two interfaces.
•public
class RandomAccessFile
implements DataOutput, DataInput
11
Example
class SampleInterface {
public static void main(String[] args) {
try {
RandomAccessFile r=new RandomAccessFile("fil", "r");
printInterfaceNames(r);
} catch (IOException e) {
System.out.println(e);
}
}
}
static void printInterfaceNames(Object o) {
Class c = o.getClass();
Class[] theInterfaces = c.getInterfaces();
for (int i = 0; i < theInterfaces.length; i++) {
String interfaceName = theInterfaces[i].getName();
System.out.println(interfaceName);
}
}
12
Examining Interfaces

The isInterface() method helps in
distinguishing between interfaces and
classes.
13
Example

class SampleCheckInterface {
public static void main(String[] args) {
Class observer = Observer.class;
Class observable = Observable.class;
verifyInterface(observer);
verifyInterface(observable);
}
static void verifyInterface(Class c) {
String name = c.getName();
if (c.isInterface()) {
System.out.println(name + " is an interface.");
} else {
System.out.println(name + " is a class.");
}
}

}
Output?
14
Identifying Class Fields

You might want to find out what fields
belong to a particular class, by invoking
the getFields() method on a Class
object.
15
Example

class SampleField {
public static void main(String[] args) {
GridBagConstraints g = new GridBagConstraints();
printFieldNames(g);
}
}
static void printFieldNames(Object o) {
Class c = o.getClass();
Field[] publicFields = c.getFields();
for (int i = 0; i < publicFields.length; i++) {
String fieldName = publicFields[i].getName();
Class typeClass = publicFields[i].getType();
String fieldType = typeClass.getName();
System.out.println("Name: " + fieldName +
", Type: " + fieldType);
}
}
16
Is the field an array?

Use the Class.isArray() method.

Field[] publicFields = targetClass.getFields();
for (int i = 0; i < publicFields.length; i++) {
String fieldName = publicFields[i].getName();
Class typeClass = publicFields[i].getType();
String fieldType = typeClass.getName();
if (typeClass.isArray()) {
System.out.println("Name: " + fieldName +
", Type: " + fieldType);
}
}
17
Retrieving Component Types


Integer[] is an array with component type
Integer
The component type of a
multidimensional array is an array.
• Integer[][] m = new Integer[10][10];
• In the line above the component type of m
is…
• Integer[]
18
Class Constructors


Information about constructors is
retrieved by calling the getConstructors()
method.
Returns an Array of Constructor objects
19
Example
class SampleConstructor {
public static void main(String[] args) {
Rectangle r = new Rectangle();
showConstructors(r);
}
}
static void showConstructors(Object o) {
Class c = o.getClass();
Constructor[] theConstr = c.getConstructors();
for (int i = 0; i < theConstr.length; i++) {
System.out.print("( ");
Class[] parameterTypes = theConstr[i].getParameterTypes();
for (int k = 0; k < parameterTypes.length; k++) {
String parameterString = parameterTypes[k].getName();
System.out.print(parameterString + " ");
}
System.out.println(")");
}
}
20
Methods

Methods are retrieved in a similar
manner, in an Array.
21
Manipulating Objects

With the reflection API you may also
• Create objects and Arrays of objects
• Get and set field values
• Invoke methods
22
“Real Life” Example from the
IFOR navigation project

Ini file:

load.rangearrayproxy = com.ifor.proxy.RangeArrayProxy
load.tycoradararrayproxy1 = com.ifor.proxy.RangeArrayProxy
load.tycoradararrayproxy2 = com.ifor.proxy.RangeArrayProxy
load.map2dproxy = com.ifor.proxy.Obstacle2DProxy



23
Example cont.
Java:
public Loadable loadableFactory(String className) {
Loadable object = null;
try
{
Class classDefinition = Class.forName(className);
object = (Loadable)classDefinition.newInstance();
}
catch (IllegalArgumentException ex)
{ logger.log(this, "className + "
catch (InstantiationException ex)
{ logger.log(this, "className + "
catch (IllegalAccessException ex)
{ logger.log(this, "className + "
catch (ClassNotFoundException ex)
{ logger.log(this, "className + "
}
" + ex, Logger.EXCEPTION);}
" + ex, Logger.EXCEPTION);}
" + ex, Logger.EXCEPTION);}
" + ex, Logger.EXCEPTION);}
return object;
24
Reflection classes

The 7 classes that compose the reflection API:
•
•
•
•
•
•
•

Object: Provides the getClass() method.
Class: Reflects Classes and Interfaces.
Array: Provides static methods to dynamically create and access
arrays.
Constructor: Allows you to instantiate a class dynamically.
Field: Allows you to invoke the method dynamically.
Method: Provides access to a single method on a class or
interface
Modifier: Allows you to get information about the access modifiers
of a class and its members.
Object and Class are part of the java.lang package, while the
rest is part of java.lang.reflect package.
25