org.eigenbase.util
Class ReflectUtil

java.lang.Object
  extended by org.eigenbase.util.ReflectUtil

public abstract class ReflectUtil
extends Object

Static utilities for Java reflection.

Version:
$Id: //open/dev/farrago/src/org/eigenbase/util/ReflectUtil.java#21 $
Author:
John V. Sichi

Field Summary
private static Map<Class,Class> primitiveToBoxingMap
           
private static Map<Class,Method> primitiveToByteBufferReadMethod
           
private static Map<Class,Method> primitiveToByteBufferWriteMethod
           
 
Constructor Summary
ReflectUtil()
           
 
Method Summary
static
<R extends ReflectiveVisitor,E>
ReflectiveVisitDispatcher<R,E>
createDispatcher(Class<R> visitorBaseClazz, Class<E> visiteeBaseClazz)
          Creates a dispatcher for calls to lookupVisitMethod(java.lang.Class, java.lang.Class, java.lang.String).
static Class getBoxingClass(Class primitiveClass)
          Gets the Java boxing class for a primitive class.
static Method getByteBufferReadMethod(Class clazz)
          Uses reflection to find the correct java.nio.ByteBuffer "absolute get" method for a given primitive type.
static Method getByteBufferWriteMethod(Class clazz)
          Uses reflection to find the correct java.nio.ByteBuffer "absolute put" method for a given primitive type.
static Class<?> getClassForName(String name)
          Looks up a class by name.
static String getUnmangledMethodName(Class declaringClass, String methodName, Class[] paramTypes)
          Composes a string representing a human-readable method name (with neither exception nor return type information).
static String getUnmangledMethodName(Method method)
          Composes a string representing a human-readable method name (with neither exception nor return type information).
static String getUnqualifiedClassName(Class c)
          Gets the name of a class with no package qualifiers; if it's an inner class, it will still be qualified by the containing class (X$Y).
static boolean invokeVisitor(ReflectiveVisitor visitor, Object visitee, Class hierarchyRoot, String visitMethodName)
          Implements the Glossary.VisitorPattern via reflection.
private static boolean invokeVisitorInternal(Object visitor, Object visitee, Class hierarchyRoot, String visitMethodName)
          Shared implementation of the two forms of invokeVisitor.
static Method lookupVisitMethod(Class<?> visitorClass, Class<?> visiteeClass, String visitMethodName)
          Looks up a visit method.
private static Method lookupVisitMethod(Class<?> visitorClass, Class<?> visiteeClass, String visitMethodName, Class<?>[] paramTypes, Map<Class<?>,Method> cache)
           
static Method lookupVisitMethod(Class<?> visitorClass, Class<?> visiteeClass, String visitMethodName, List<Class> additionalParameterTypes)
          Looks up a visit method taking additional parameters beyond the overloaded visitee type.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

primitiveToBoxingMap

private static Map<Class,Class> primitiveToBoxingMap

primitiveToByteBufferReadMethod

private static Map<Class,Method> primitiveToByteBufferReadMethod

primitiveToByteBufferWriteMethod

private static Map<Class,Method> primitiveToByteBufferWriteMethod
Constructor Detail

ReflectUtil

public ReflectUtil()
Method Detail

getByteBufferReadMethod

public static Method getByteBufferReadMethod(Class clazz)
Uses reflection to find the correct java.nio.ByteBuffer "absolute get" method for a given primitive type.

Parameters:
clazz - the Class object representing the primitive type
Returns:
corresponding method

getByteBufferWriteMethod

public static Method getByteBufferWriteMethod(Class clazz)
Uses reflection to find the correct java.nio.ByteBuffer "absolute put" method for a given primitive type.

Parameters:
clazz - the Class object representing the primitive type
Returns:
corresponding method

getBoxingClass

public static Class getBoxingClass(Class primitiveClass)
Gets the Java boxing class for a primitive class.

Parameters:
primitiveClass - representative class for primitive (e.g. java.lang.Integer.TYPE)
Returns:
corresponding boxing Class (e.g. java.lang.Integer)

getUnqualifiedClassName

public static String getUnqualifiedClassName(Class c)
Gets the name of a class with no package qualifiers; if it's an inner class, it will still be qualified by the containing class (X$Y).

Parameters:
c - the class of interest
Returns:
the unqualified name

getUnmangledMethodName

public static String getUnmangledMethodName(Class declaringClass,
                                            String methodName,
                                            Class[] paramTypes)
Composes a string representing a human-readable method name (with neither exception nor return type information).

Parameters:
declaringClass - class on which method is defined
methodName - simple name of method without signature
paramTypes - method parameter types
Returns:
unmangled method name

getUnmangledMethodName

public static String getUnmangledMethodName(Method method)
Composes a string representing a human-readable method name (with neither exception nor return type information).

Parameters:
method - method whose name is to be generated
Returns:
unmangled method name

invokeVisitor

public static boolean invokeVisitor(ReflectiveVisitor visitor,
                                    Object visitee,
                                    Class hierarchyRoot,
                                    String visitMethodName)
Implements the Glossary.VisitorPattern via reflection. The basic technique is taken from a Javaworld article. For an example of how to use it, see ReflectVisitorTest. Visit method lookup follows the same rules as if compile-time resolution for VisitorClass.visit(VisiteeClass) were performed. An ambiguous match due to multiple interface inheritance results in an IllegalArgumentException. A non-match is indicated by returning false.

Parameters:
visitor - object whose visit method is to be invoked
visitee - object to be passed as a parameter to the visit method
hierarchyRoot - if non-null, visitor method will only be invoked if it takes a parameter whose type is a subtype of hierarchyRoot
visitMethodName - name of visit method, e.g. "visit"
Returns:
true if a matching visit method was found and invoked

invokeVisitorInternal

private static boolean invokeVisitorInternal(Object visitor,
                                             Object visitee,
                                             Class hierarchyRoot,
                                             String visitMethodName)
Shared implementation of the two forms of invokeVisitor.

Parameters:
visitor - object whose visit method is to be invoked
visitee - object to be passed as a parameter to the visit method
hierarchyRoot - if non-null, visitor method will only be invoked if it takes a parameter whose type is a subtype of hierarchyRoot
visitMethodName - name of visit method, e.g. "visit"
Returns:
true if a matching visit method was found and invoked

lookupVisitMethod

public static Method lookupVisitMethod(Class<?> visitorClass,
                                       Class<?> visiteeClass,
                                       String visitMethodName)
Looks up a visit method.

Parameters:
visitorClass - class of object whose visit method is to be invoked
visiteeClass - class of object to be passed as a parameter to the visit method
visitMethodName - name of visit method
Returns:
method found, or null if none found

lookupVisitMethod

public static Method lookupVisitMethod(Class<?> visitorClass,
                                       Class<?> visiteeClass,
                                       String visitMethodName,
                                       List<Class> additionalParameterTypes)
Looks up a visit method taking additional parameters beyond the overloaded visitee type.

Parameters:
visitorClass - class of object whose visit method is to be invoked
visiteeClass - class of object to be passed as a parameter to the visit method
visitMethodName - name of visit method
additionalParameterTypes - list of additional parameter types
Returns:
method found, or null if none found
See Also:
createDispatcher(Class,Class)

lookupVisitMethod

private static Method lookupVisitMethod(Class<?> visitorClass,
                                        Class<?> visiteeClass,
                                        String visitMethodName,
                                        Class<?>[] paramTypes,
                                        Map<Class<?>,Method> cache)

createDispatcher

public static <R extends ReflectiveVisitor,E> ReflectiveVisitDispatcher<R,E> createDispatcher(Class<R> visitorBaseClazz,
                                                                                              Class<E> visiteeBaseClazz)
Creates a dispatcher for calls to lookupVisitMethod(java.lang.Class, java.lang.Class, java.lang.String). The dispatcher caches methods between invocations.

Parameters:
visitorBaseClazz - Visitor base class
visiteeBaseClazz - Visitee base class
Returns:
cache of methods

getClassForName

public static Class<?> getClassForName(String name)
                                throws Exception
Looks up a class by name. This is like Class.forName, except that it handles primitive type names.

Parameters:
name - fully-qualified name of class to look up
Returns:
class
Throws:
Exception