Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Java reflections API Lecture 1. 2 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.

Similar presentations


Presentation on theme: "1 Java reflections API Lecture 1. 2 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."— Presentation transcript:

1 1 Java reflections API Lecture 1

2 2 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.

3 3 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…

4 4 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.

5 5 Confusion continued…

6 6 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);

7 7 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?

8 8 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?

9 9 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.

10 10 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(); } } }

11 11 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

12 12 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); } } }

13 13 Examining Interfaces The isInterface() method helps in distinguishing between interfaces and classes.

14 14 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?

15 15 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.

16 16 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); } } }

17 17 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); } }

18 18 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[]

19 19 Class Constructors Information about constructors is retrieved by calling the getConstructors() method. Returns an Array of Constructor objects

20 20 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(")"); } } }

21 21 Methods Methods are retrieved in a similar manner, in an Array.

22 22 Manipulating Objects With the reflection API you may also Create objects and Arrays of objects Get and set field values Invoke methods

23 23 “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

24 24 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 + " " + ex, Logger.EXCEPTION);} catch (InstantiationException ex) { logger.log(this, "className + " " + ex, Logger.EXCEPTION);} catch (IllegalAccessException ex) { logger.log(this, "className + " " + ex, Logger.EXCEPTION);} catch (ClassNotFoundException ex) { logger.log(this, "className + " " + ex, Logger.EXCEPTION);} return object; }

25 25 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.


Download ppt "1 Java reflections API Lecture 1. 2 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."

Similar presentations


Ads by Google