Presentation is loading. Please wait.

Presentation is loading. Please wait.

03G-1 Reflection In Java For every loaded class, the Java Runtime Environment (JRE) maintains an associated Class object The Class object “ reflects ”

Similar presentations


Presentation on theme: "03G-1 Reflection In Java For every loaded class, the Java Runtime Environment (JRE) maintains an associated Class object The Class object “ reflects ”"— Presentation transcript:

1 03G-1 Reflection In Java For every loaded class, the Java Runtime Environment (JRE) maintains an associated Class object The Class object “ reflects ” the class it represents The primitive Java types are also represented as Class objects Reflection can be used to: l Determine the class of an object. l Get information about a class's modifiers, fields, methods, interfaces, constructors, and superclasses. l Create an instance of a class whose name is not known until runtime. l Get and set the value of an object's field. l Invoke a method on an object.

2 03G-2 Main Java reflection Classes u Class ( java.lang.Class ) l Instances of the class Class represent classes and interfaces in a running Java application, every object is represented by a Class object. u Member l An Interface that reflects identifying information about a single member (a field or a method) or a constructor. u Method ( java.lang.reflect.Method ) l Implements Member Interface l provides information about, and access to, a single method on a class or interface. l Represents instance methods and class methods ( static ) u Field l Implements Member Interface l provides information about, and dynamic access to, a single field ( also for static fields ) l Provides access and modification ( set, get ) methods.

3 03G-3 Main Java reflection Classes u Constructor l provides information about, and access to, a single constructor for a class. u Package l Package objects contain version information about the implementation and specification of a Java package u Modifier l provides static methods and constants to decode class and member access modifiers. The sets of modifiers are represented as integers with distinct bit positions representing different modifiers

4 03G-4 Accessing the Class object To get the Class object for an object mystery: Class c = mystery.getClass(); Or, using the class name: Class c = Class.forName(“mysteryClass”); Getting the superclass of MysteryClass: Class s = c.getSuperclass(); Getting the class name: String s = c.getName(); Discovering the interfaces implemented by a class: Class[] interfaces = c.getInterfaces(); Discovering the fields of a class: Field[] fields = c.getFields(); Discovering the methods of a class: Method[] methods = c.getMethods();

5 03G-5Example static void showMethods(Object o) { Class c = o.getClass(); Method[] theMethods = c.getMethods(); for (int i = 0; i < theMethods.length; i++) { String methodString = theMethods[i].getName(); System.out.println("Name: " + methodString); String returnString = theMethods[i].getReturnType().getName(); System.out.println(" Return Type: " + returnString); Class[] parameterTypes = theMethods[i].getParameterTypes(); System.out.print(" Parameter Types:"); for (int k = 0; k < parameterTypes.length; k ++) { String parameterString = parameterTypes[k].getName(); System.out.print(" " + parameterString); } System.out.println(); }

6 03G-6 Example – Cont. Output for a call of the form: Polygon p = new Polygon(); showMethods(p); Name: equals Return Type: boolean Parameter Types: java.lang.Object Name: getClass Return Type: java.lang.Class Parameter Types: Name: intersects Return Type: boolean Parameter Types: double double double double.

7 03G-7 A Java Reflection Example u Illustrates Four Issues: l Runtime type Information (RTTI) l Introspection l Invoking Method Objects l Dynamic Instantiation

8 03G-8 Back to our Employee Example … Employee number level print() MonthlyEmployee print() HourlyEmployee print() Only partial view of the classes … public final class MonthlyEmployee extends Employee { public void print() { System.out.println(“I’m a Monthly Employee"); } public final class HourlyEmployee extends Employee { public void print() { System.out.println(“I’m a Hourly Employee"); }

9 03G-9 Reflection and Dynamic Binding What is the output of the following test code: Employee e; e = new MonthlyEmployee(); Class c = e.getClass(); System.out.println("class of e = " + c.getName()); e = new HourlyEmployee(); c = e.getClass(); System.out.println("class of e = " + c.getName()); class of e = MonthlyEmployee class of e = HourlyEmployee

10 03G-10SuperClass What is the output of the following test code: c = c.getSuperclass(); System.out.println("base class of e = " + c.getName()); c = c.getSuperclass(); System.out.println("base of base class of e = " + c.getName()); base class of e = Employee base of base class of e = java.lang.Object

11 03G-11 Getting all fields Field fields[] = c.getFields(); for(int i = 0; i < fields.length; i++) { System.out.print(fields[i].getName() + "= "); System.out.println(fields[i].getInt(e)); } The output produced: number= 111 level= 12 e is an instance of Employee or its subtype ! Non public fields are not printed!

12 03G-12 Setting a Field Let’s promote an employee… Field fields[] = c.getFields(); for(int i = 0; i < fields.length; i++) { if(fields[i].getName() == “Level”) fields[i].setInt(e, (fields[i].getInt(e))++); }

13 03G-13 Examining Modifiers What is the output of the following test code: 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"); public final

14 03G-14 Invoking Method Objects We can ask a method object to invoke the method it represents we must provide it with the implicit and explicit arguments Employee e = new HourlyEmployee(); Class c = e.getClass(); Method m = c.getMethod(“print”, null); m.invoke(e, null); the output produced: I’m a Hourly Employee

15 03G-15 Dynamic Instantiation The universal printer gets the employee type and invokes the print method.. class UniversalPrinter { public void print(String empType) { Class c = Class.forName(empType); Employee emp = (Employee ) c.newInstance(); emp.print(); } -for calling other constructors( with arguments ), use the Constructor class - Constructor c =... - Object newObject = c.newInstance( Object[] initArguments ) What is the output of the following code? UniversalPrinter p = new UniversalPrinter(); String empType; empType = “HourlyEmployee"; p.print(empType); empType = “MonthlyEmployee"; p.print(empType);

16 03G-16 Reflection - What ’ s missing u Reflection is ‘ read only ’ l Cant add / modify fields, methods u Non public members (fields, methods) are not accessible u Implementation is not available l Program logic is not reflected u Major performance impact l Much slower then doing the same operations directly … u Complex code


Download ppt "03G-1 Reflection In Java For every loaded class, the Java Runtime Environment (JRE) maintains an associated Class object The Class object “ reflects ”"

Similar presentations


Ads by Google