Class ReflectUtil
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic interface
Can invoke a method on an object of type E with return type T. -
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionstatic <R extends ReflectiveVisitor,
E>
ReflectiveVisitDispatcher<R,E> createDispatcher
(Class<R> visitorBaseClazz, Class<E> visiteeBaseClazz) Creates a dispatcher for calls tolookupVisitMethod(java.lang.Class<?>, java.lang.Class<?>, java.lang.String)
.static <E,
T> ReflectUtil.MethodDispatcher<T> createMethodDispatcher
(Class<T> returnClazz, ReflectiveVisitor visitor, String methodName, Class<E> arg0Clazz, Class... otherArgClasses) Creates a dispatcher for calls to a single multi-method on a particular object.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 String
getParameterName
(Method method, int i) Derives the name of thei
th parameter of a method.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
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 theGlossary.VISITOR_PATTERN
via reflection.static boolean
isParameterOptional
(Method method, int i) Derives whether thei
th parameter of a method is optional.static boolean
Returns whether a member (constructor, method or field) is public.static boolean
Returns whether a member (constructor, method or field) is static.static @Nullable Method
lookupVisitMethod
(Class<?> visitorClass, Class<?> visiteeClass, String visitMethodName) Looks up a visit method.static @Nullable Method
lookupVisitMethod
(Class<?> visitorClass, Class<?> visiteeClass, String visitMethodName, List<Class> additionalParameterTypes) Looks up a visit method taking additional parameters beyond the overloaded visitee type.static boolean
mightBeAssignableFrom
(Class<?> parameterType, Class<?> argumentType) Returns whether a parameter of a given type could possibly have an argument of a given type.
-
Constructor Details
-
ReflectUtil
public ReflectUtil()
-
-
Method Details
-
getByteBufferReadMethod
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
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
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
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 definedmethodName
- simple name of method without signatureparamTypes
- method parameter types- Returns:
- unmangled method name
-
getUnmangledMethodName
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 theGlossary.VISITOR_PATTERN
via reflection. The basic technique is taken from a Javaworld article. For an example of how to use it, seeReflectVisitorTest
.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 invokedvisitee
- object to be passed as a parameter to the visit methodhierarchyRoot
- if non-null, visitor method will only be invoked if it takes a parameter whose type is a subtype of hierarchyRootvisitMethodName
- name of visit method, e.g. "visit"- Returns:
- true if a matching visit method was found and invoked
-
lookupVisitMethod
public static @Nullable Method lookupVisitMethod(Class<?> visitorClass, Class<?> visiteeClass, String visitMethodName) Looks up a visit method.- Parameters:
visitorClass
- class of object whose visit method is to be invokedvisiteeClass
- class of object to be passed as a parameter to the visit methodvisitMethodName
- name of visit method- Returns:
- method found, or null if none found
-
lookupVisitMethod
public static @Nullable 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 invokedvisiteeClass
- class of object to be passed as a parameter to the visit methodvisitMethodName
- name of visit methodadditionalParameterTypes
- list of additional parameter types- Returns:
- method found, or null if none found
- See Also:
-
createDispatcher
public static <R extends ReflectiveVisitor,E> ReflectiveVisitDispatcher<R,E> createDispatcher(Class<R> visitorBaseClazz, Class<E> visiteeBaseClazz) Creates a dispatcher for calls tolookupVisitMethod(java.lang.Class<?>, java.lang.Class<?>, java.lang.String)
. The dispatcher caches methods between invocations.- Parameters:
visitorBaseClazz
- Visitor base classvisiteeBaseClazz
- Visitee base class- Returns:
- cache of methods
-
createMethodDispatcher
public static <E,T> ReflectUtil.MethodDispatcher<T> createMethodDispatcher(Class<T> returnClazz, ReflectiveVisitor visitor, String methodName, Class<E> arg0Clazz, Class... otherArgClasses) Creates a dispatcher for calls to a single multi-method on a particular object.Calls to that multi-method are resolved by looking for a method on the runtime type of that object, with the required name, and with the correct type or a subclass for the first argument, and precisely the same types for other arguments.
For instance, a dispatcher created for the method
String foo(Vehicle, int, List)
could be used to call the methods
String foo(Car, int, List)
String foo(Bus, int, List)(because Car and Bus are subclasses of Vehicle, and they occur in the polymorphic first argument) but not the method
String foo(Car, int, ArrayList)
(only the first argument is polymorphic).
You must create an implementation of the method for the base class. Otherwise throws
IllegalArgumentException
.- Parameters:
returnClazz
- Return type of methodvisitor
- Object on which to invoke the methodmethodName
- Name of methodarg0Clazz
- Base type of argument zerootherArgClasses
- Types of remaining arguments
-
getParameterName
Derives the name of thei
th parameter of a method. -
isParameterOptional
Derives whether thei
th parameter of a method is optional. -
mightBeAssignableFrom
Returns whether a parameter of a given type could possibly have an argument of a given type.For example, consider method
foo(Object o, String s, int i, Number n, BigDecimal d
To which of those parameters could I pass a value that is an instance of
HashMap
? The answer:o
yes,s
no (String
is a final class),i
no,n
yes (Number
is an interface, andHashMap
is a non-final class, so I could create a sub-class ofHashMap
that implementsNumber
,d
yes (BigDecimal
is a non-final class).
-
isPublic
Returns whether a member (constructor, method or field) is public. -
isStatic
Returns whether a member (constructor, method or field) is static.
-