Class MethodMap
- java.lang.Object
-
- org.apache.velocity.util.introspection.MethodMap
-
public class MethodMap extends java.lang.Object
- Version:
- $Id: MethodMap.java 935975 2010-04-20 16:04:55Z nbubna $
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
MethodMap.AmbiguousException
Simple distinguishable exception, used when we run across ambiguous overloading.
-
Field Summary
Fields Modifier and Type Field Description private static int
INCOMPARABLE
private static int
LESS_SPECIFIC
(package private) java.util.Map
methodByNameMap
Keep track of all methods with the same name.private static int
MORE_SPECIFIC
-
Constructor Summary
Constructors Constructor Description MethodMap()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
add(java.lang.reflect.Method method)
Add a method to a list of methods by name.private static int
compare(java.lang.Class[] c1, java.lang.Class[] c2)
Determines which method signature (represented by a class array) is more specific.java.lang.reflect.Method
find(java.lang.String methodName, java.lang.Object[] args)
Find a method.java.util.List
get(java.lang.String key)
Return a list of methods with the same name.private static java.lang.reflect.Method
getBestMatch(java.util.List methods, java.lang.Class[] args)
private static boolean
isApplicable(java.lang.reflect.Method method, java.lang.Class[] classes)
Returns true if the supplied method is applicable to actual argument types.private static boolean
isConvertible(java.lang.Class formal, java.lang.Class actual, boolean possibleVarArg)
private static boolean
isStrictConvertible(java.lang.Class formal, java.lang.Class actual, boolean possibleVarArg)
-
-
-
Field Detail
-
MORE_SPECIFIC
private static final int MORE_SPECIFIC
- See Also:
- Constant Field Values
-
LESS_SPECIFIC
private static final int LESS_SPECIFIC
- See Also:
- Constant Field Values
-
INCOMPARABLE
private static final int INCOMPARABLE
- See Also:
- Constant Field Values
-
methodByNameMap
java.util.Map methodByNameMap
Keep track of all methods with the same name.
-
-
Method Detail
-
add
public void add(java.lang.reflect.Method method)
Add a method to a list of methods by name. For a particular class we are keeping track of all the methods with the same name.- Parameters:
method
-
-
get
public java.util.List get(java.lang.String key)
Return a list of methods with the same name.- Parameters:
key
-- Returns:
- List list of methods
-
find
public java.lang.reflect.Method find(java.lang.String methodName, java.lang.Object[] args) throws MethodMap.AmbiguousException
Find a method. Attempts to find the most specific applicable method using the algorithm described in the JLS section 15.12.2 (with the exception that it can't distinguish a primitive type argument from an object type argument, since in reflection primitive type arguments are represented by their object counterparts, so for an argument of type (say) java.lang.Integer, it will not be able to decide between a method that takes int and a method that takes java.lang.Integer as a parameter.
This turns out to be a relatively rare case where this is needed - however, functionality like this is needed.
- Parameters:
methodName
- name of methodargs
- the actual arguments with which the method is called- Returns:
- the most specific applicable method, or null if no method is applicable.
- Throws:
MethodMap.AmbiguousException
- if there is more than one maximally specific applicable method
-
getBestMatch
private static java.lang.reflect.Method getBestMatch(java.util.List methods, java.lang.Class[] args)
-
compare
private static int compare(java.lang.Class[] c1, java.lang.Class[] c2)
Determines which method signature (represented by a class array) is more specific. This defines a partial ordering on the method signatures.- Parameters:
c1
- first signature to comparec2
- second signature to compare- Returns:
- MORE_SPECIFIC if c1 is more specific than c2, LESS_SPECIFIC if c1 is less specific than c2, INCOMPARABLE if they are incomparable.
-
isApplicable
private static boolean isApplicable(java.lang.reflect.Method method, java.lang.Class[] classes)
Returns true if the supplied method is applicable to actual argument types.- Parameters:
method
- method that will be calledclasses
- arguments to method- Returns:
- true if method is applicable to arguments
-
isConvertible
private static boolean isConvertible(java.lang.Class formal, java.lang.Class actual, boolean possibleVarArg)
-
isStrictConvertible
private static boolean isStrictConvertible(java.lang.Class formal, java.lang.Class actual, boolean possibleVarArg)
-
-