silk
Class Invoke

java.lang.Object
silk.Invoke
- public class Invoke
- extends java.lang.Object
Provides dynamic Java method invocation through Java's Reflection
interface. For a good discussion of a Scheme implementation, and
the issues involved with dynamic method invocation in Java see:
Michael Travers, Java Q & A, Dr. Dobb's Journal, Jan., 2000,
p. 103-112.
Primitive types are not widened because it would make method
selection more ambiguous. By memoizing constructorTable() and
methodTable() dynamic method lookup can be done without consing.
|
Method Summary |
private static java.lang.Object[] |
constructorTable(java.lang.Class c)
|
static java.lang.reflect.Constructor |
findConstructor(java.lang.Object target,
Pair types)
Look up a particular constructor given its name, and the name of its
declaring class, and a list of argument type names. |
static java.lang.Object |
findMethod(java.lang.Object[] methods,
java.lang.Object[] args)
Find the most applicable method. |
static java.lang.reflect.Method |
findMethod(java.lang.String name,
java.lang.Object target,
Pair types)
Look up a particular method given its name, and the name of its
declaring class, and a list of argument type names. |
static java.lang.Object[] |
getCachedMethodTable(java.lang.Class c,
Symbol name,
boolean isStatic)
|
private static java.util.Hashtable |
getMethodCache(boolean isStatic)
|
private static java.util.Hashtable |
getNameTable(java.util.Hashtable table,
Symbol name)
|
private static java.lang.Class[] |
getParameterTypes(java.lang.Object m)
|
static java.lang.Object |
invokeConstructor(java.lang.Class c,
java.lang.Object[] args)
|
static java.lang.Object |
invokeInstance(java.lang.Object target,
Symbol name,
java.lang.Object[] args)
|
static java.lang.Object |
invokeMethod(java.lang.Class c,
java.lang.Object target,
Symbol name,
java.lang.Object[] args,
boolean isStatic)
|
static java.lang.Object |
invokeRawConstructor(java.lang.reflect.Constructor m,
java.lang.Object[] args)
|
static java.lang.Object |
invokeRawMethod(java.lang.reflect.Method m,
java.lang.Object target,
java.lang.Object[] args)
|
static java.lang.Object |
invokeStatic(java.lang.Class c,
Symbol name,
java.lang.Object[] args)
|
static boolean |
isApplicable(java.lang.Class[] types,
java.lang.Object[] args)
|
private static boolean |
isArgApplicable(java.lang.Class p,
java.lang.Object a)
|
private static void |
maybeAdd(java.util.Vector result,
java.lang.reflect.Method m1)
Only add an instance method if no superclass provides one. |
private static java.lang.Object[] |
methodArray(java.lang.Object[] v)
Returns Object[] of parameterType, method pairs. |
static java.lang.Object[] |
methodTable(java.lang.Class c,
Symbol name,
boolean isStatic)
|
static java.lang.Object[] |
methodTable0(java.lang.Class c,
Symbol name,
boolean isStatic)
|
static java.lang.Object[] |
methodTableLookup(java.lang.Class c,
Symbol name,
boolean isStatic)
|
static java.lang.Object[] |
methodTableLookupInstance(java.lang.Class c,
Symbol name)
|
static java.lang.Object[] |
methodTableLookupStatic(java.lang.Class c,
Symbol name)
|
static java.util.Vector |
methodVector(java.lang.Class c,
java.lang.String name)
|
static java.util.Vector |
methodVectorMerge(java.lang.Class c,
java.lang.String name,
java.util.Vector result)
Add new methods to your superclasses table. |
private static boolean |
moreApplicable(java.lang.Class[] p1,
java.lang.Class[] p2)
A method m1 is more specific than method m2 if all parameters of
m1 are subclasses of the corresponding parameters of m2. |
static boolean |
parameterTypesMatch(java.lang.Class[] p1,
java.lang.Class[] p2)
Do the paramter types of an instance method match? |
static java.lang.Object |
peek(java.lang.Object target,
java.lang.String name)
|
private static java.lang.Object |
peek0(java.lang.Class c,
java.lang.String name,
java.lang.Object target)
|
static java.lang.Object |
peekStatic(java.lang.Class c,
java.lang.String name)
|
static java.lang.Object |
poke(java.lang.Object target,
java.lang.String name,
java.lang.Object value)
|
private static java.lang.Object |
poke0(java.lang.Class c,
java.lang.String name,
java.lang.Object target,
java.lang.Object value)
|
static java.lang.Object |
pokeStatic(java.lang.Class c,
java.lang.String name,
java.lang.Object value)
|
private static java.lang.Class |
primitiveWrapperType(java.lang.Class p)
Given a primitive type return its wrapper class. |
static void |
putCachedMethodTable(java.lang.Class c,
Symbol name,
boolean isStatic,
java.lang.Object value)
|
static java.lang.Class[] |
toClassArray(Pair types,
int n)
|
| Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
BUCKET_SIZE
public static final int BUCKET_SIZE
- Each bucket in an method table contains a Class[] of
parameterTypes and the corresponding method or constructor.
- See Also:
- Constant Field Values
constructorCache
public static final java.util.Hashtable constructorCache
staticCache
public static final java.util.Hashtable staticCache
instanceCache
public static final java.util.Hashtable instanceCache
Invoke
public Invoke()
peek
public static java.lang.Object peek(java.lang.Object target,
java.lang.String name)
peekStatic
public static java.lang.Object peekStatic(java.lang.Class c,
java.lang.String name)
peek0
private static java.lang.Object peek0(java.lang.Class c,
java.lang.String name,
java.lang.Object target)
poke
public static java.lang.Object poke(java.lang.Object target,
java.lang.String name,
java.lang.Object value)
pokeStatic
public static java.lang.Object pokeStatic(java.lang.Class c,
java.lang.String name,
java.lang.Object value)
poke0
private static java.lang.Object poke0(java.lang.Class c,
java.lang.String name,
java.lang.Object target,
java.lang.Object value)
invokeConstructor
public static java.lang.Object invokeConstructor(java.lang.Class c,
java.lang.Object[] args)
invokeRawConstructor
public static java.lang.Object invokeRawConstructor(java.lang.reflect.Constructor m,
java.lang.Object[] args)
invokeStatic
public static java.lang.Object invokeStatic(java.lang.Class c,
Symbol name,
java.lang.Object[] args)
invokeInstance
public static java.lang.Object invokeInstance(java.lang.Object target,
Symbol name,
java.lang.Object[] args)
invokeMethod
public static java.lang.Object invokeMethod(java.lang.Class c,
java.lang.Object target,
Symbol name,
java.lang.Object[] args,
boolean isStatic)
invokeRawMethod
public static java.lang.Object invokeRawMethod(java.lang.reflect.Method m,
java.lang.Object target,
java.lang.Object[] args)
constructorTable
private static java.lang.Object[] constructorTable(java.lang.Class c)
getMethodCache
private static java.util.Hashtable getMethodCache(boolean isStatic)
getNameTable
private static java.util.Hashtable getNameTable(java.util.Hashtable table,
Symbol name)
getCachedMethodTable
public static java.lang.Object[] getCachedMethodTable(java.lang.Class c,
Symbol name,
boolean isStatic)
putCachedMethodTable
public static void putCachedMethodTable(java.lang.Class c,
Symbol name,
boolean isStatic,
java.lang.Object value)
methodTable0
public static java.lang.Object[] methodTable0(java.lang.Class c,
Symbol name,
boolean isStatic)
methodTable
public static java.lang.Object[] methodTable(java.lang.Class c,
Symbol name,
boolean isStatic)
methodTableLookup
public static java.lang.Object[] methodTableLookup(java.lang.Class c,
Symbol name,
boolean isStatic)
methodTableLookupStatic
public static java.lang.Object[] methodTableLookupStatic(java.lang.Class c,
Symbol name)
methodTableLookupInstance
public static java.lang.Object[] methodTableLookupInstance(java.lang.Class c,
Symbol name)
methodVector
public static java.util.Vector methodVector(java.lang.Class c,
java.lang.String name)
methodVectorMerge
public static java.util.Vector methodVectorMerge(java.lang.Class c,
java.lang.String name,
java.util.Vector result)
- Add new methods to your superclasses table.
maybeAdd
private static void maybeAdd(java.util.Vector result,
java.lang.reflect.Method m1)
- Only add an instance method if no superclass provides one.
getParameterTypes
private static java.lang.Class[] getParameterTypes(java.lang.Object m)
methodArray
private static java.lang.Object[] methodArray(java.lang.Object[] v)
- Returns Object[] of parameterType, method pairs.
parameterTypesMatch
public static boolean parameterTypesMatch(java.lang.Class[] p1,
java.lang.Class[] p2)
- Do the paramter types of an instance method match?
findMethod
public static java.lang.Object findMethod(java.lang.Object[] methods,
java.lang.Object[] args)
- Find the most applicable method. For instance methods
getMethods() has already handled the "this" argument, so
instance and static methods are matched the same way.
isApplicable
public static boolean isApplicable(java.lang.Class[] types,
java.lang.Object[] args)
isArgApplicable
private static boolean isArgApplicable(java.lang.Class p,
java.lang.Object a)
primitiveWrapperType
private static java.lang.Class primitiveWrapperType(java.lang.Class p)
- Given a primitive type return its wrapper class.
moreApplicable
private static boolean moreApplicable(java.lang.Class[] p1,
java.lang.Class[] p2)
- A method m1 is more specific than method m2 if all parameters of
m1 are subclasses of the corresponding parameters of m2.
findMethod
public static java.lang.reflect.Method findMethod(java.lang.String name,
java.lang.Object target,
Pair types)
- Look up a particular method given its name, and the name of its
declaring class, and a list of argument type names.
findConstructor
public static java.lang.reflect.Constructor findConstructor(java.lang.Object target,
Pair types)
- Look up a particular constructor given its name, and the name of its
declaring class, and a list of argument type names.
toClassArray
public static java.lang.Class[] toClassArray(Pair types,
int n)