Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

silk
Class Invoke  view Invoke download Invoke.java

java.lang.Object
  extended bysilk.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.


Field Summary
static int BUCKET_SIZE
          Each bucket in an method table contains a Class[] of parameterTypes and the corresponding method or constructor.
static java.util.Hashtable constructorCache
           
static java.util.Hashtable instanceCache
           
static java.util.Hashtable staticCache
           
 
Constructor Summary
Invoke()
           
 
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
 

Field Detail

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
Constructor Detail

Invoke

public Invoke()
Method Detail

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)