Reflection In Java - University of Arizona

Download Report

Transcript Reflection In Java - University of Arizona

REFLECTION IN JAVA
10/18/08 Matt Swatzell
What is Reflection?
 Some Definitions….
 Reflection is the process by which a program can
modify its own behavior.
 A program that can analyze and modify its own
parameters at runtime is considered reflective.
 Tools for manipulating code at runtime.
 In other words… A way for a program/application
to learn about itself, change itself, and perhaps
even add to itself.
Some Examples
 Reflection is used for many things:
 IDE’s / software analysis tools
 Debuggers
 Server Side Code i.e. ASP.NET
 Plug-ins
 Frameworks i.e. Java Beans
 Imitating function pointers in Java
Code Demo
 Code Demo
 How would you go about doing this?
The java.lang.Class Class
 http://java.sun.com/j2se/1.5.0/docs/api/java/l
ang/Class.html
 JVM always maintains Runtime Type
Definition for all objects.
 Determines correct methods to call
 Class is used for this purpose.
 Unique Class object for each type.
java.lang.Class cont.
 3 ways to get the Class class of an object
 (any Object).getClass();  For objects that already
exist
 Scanner scan = new Scanner(System.in);
 Class c = scan.getClass();
 (Any type).class  When you only know the type
 Works for primitives too
 Int.class;
 Scanner.class;
 Class.forName(“fully qualified path”);  Know the
name of class you want
 Class c1 = Class.forName(“java.util.Scanner”);
Useful methods in Class
 Public string Name();
 returns name of class
 Constructor[] getConstructors()
 an Array of constructors (more on these later)
 Method[] getMethods()
 an Array of methods
 Field[] getFields()
 an Array of fields
 Class[] getInterfaces()
 an Array of Interfaces
 <T> newInstance()
 An instance of the class, only works in certain cases
java.lang.reflect.Constructor
 Represents a constructor for a class object
 Important Methods
 Class getDeclaringClass();
 Int getModifiers();
 Why int?
 Class[] getParameterTypes();
 Object newInstance(Object[] args);
 Creates a new class if parameters are needed
Java.lang.reflect.Method
 Represents a method in a class
 Useful Methods in Method
 Class[] getExceptionTypes();
 Int getModifiers();
 String getName();
 Class[] getParameterTypes();
 Class getReturnType();
 Invoke(Object o, Object[] args);
 Exceptions, Exceptions, Exceptions
Java.lang.reflect.Field
 Represents a Field within a Class
 get(type)(Object obj);
 Returns the value of the field in Object obj
 set(Type)(Object o)
 Sets the value
Two more java.lang.reflector.*’s
 Java.lang.reflect.AccessibleObject
 Base for Constructor, method, field
 Allows you to modify accessibility at runtime.
 isAccessible();
 setAccessible(boolean flag);
 Breaks with SecurityManagers
 java.lang.reflect.Modifier
 Takes int and returns facts about modifers on it
 isPrivate(int i);
 toString(int i);
Can I do it with Arrays?
 Java.lang.reflect.Array
 get(type)(Object Array, int index);
 set(Type)(Object array, int Index, type value);
 newInstance(Class type, int length);
 New Instance(Class type, int[] dimensions);
Function Pointers (in a way…)
 Cannot pass location of method in java
 In C/C++ this is possible
 Passing functions as parameters
 Void doAwesomeness(function awesome);
 Reflection provides a handy workaround if
you need this functionality
 Simply pass method object and call invoke
 Before you get too excited…
 It not in Java for a reason
 Inheritance / Polymorphism usually safer.
Problems With Reflection
 Slow…..
 Security Problems
 If not security problems, than security risks
A brief intro to ClassLoader
 Q: So, other than object analyzers, generic
toStrings, and function pointers what is
Reflection good for?
 A: Loading classes dynamincally
 Sometimes you will not know all the classes that
will be needed. Used by your application
 Sometimes the user will want to add their own
 Think of VS, Eclipse, some games
ClassLoader cont.
 ClassLoader is responsible for loading classes
 Every class has reference to ClassLoader the
created it.
 Only object w/o class loader are generic Objects
in arrays.
 Primitives have no class loader
 The original ClassLoader, (called the bootstrap
class loader) has no parent class loader
 all others, as objects, do
Boot strap Class Loader
 Where does JVM look for classes?
 Some are included with application
 Custom Defined Ones
 Are all of them?
 JVM looks in ClassPath for classes, then in
program / application
 What if you want to look elsewhere?
 On your own machine, you could add to ClassPath
 Can’t do this on end-user’s
Other Options
 Only one really…
 Create a new ClassLoader that extends
abstract ClassLoader.
 Override loadClass
 Get location of file
 Get byte array of the class data
 Call define class and return the result
 You now have a class of a type that was unknown
until runtime
 Problems with inheritance
An example custom Class
Loader

Public class customLoader extends ClassLoader {

public class findClass(String name) {




}
}
Byte[] b = openFileAndGetByteArray(name);
Return defineClass(name,b,0,b.length);
Citations
 Horstmann , Cay S., and Gary Cornell. Core
Java 2 . Volume 1. Santa Clara, CA: Sun
Microsystems, 2005.
 "The Reflection API." java.sun.com. Sun
Microsystems, Web. 19 Nov 2009.