diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-03 14:23:57 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-03 14:23:57 +0000 |
commit | 3a4ab3a82e9b1b750da2d3c536d4867f69654ce5 (patch) | |
tree | 09149767fc517d769381e45ece15a5f6359fb2ca | |
parent | 44e91204bbc4a8bf8217cb8b2eea14de94e6b9d2 (diff) |
normalized get/set/invoke static/instance
-rw-r--r-- | src/jvm/clojure/lang/InstanceMemberInvoker.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Reflector.java | 241 | ||||
-rw-r--r-- | src/jvm/clojure/lang/StaticMemberInvoker.java | 74 |
3 files changed, 170 insertions, 147 deletions
diff --git a/src/jvm/clojure/lang/InstanceMemberInvoker.java b/src/jvm/clojure/lang/InstanceMemberInvoker.java index 2a888c46..116067e7 100644 --- a/src/jvm/clojure/lang/InstanceMemberInvoker.java +++ b/src/jvm/clojure/lang/InstanceMemberInvoker.java @@ -29,7 +29,7 @@ public Object invoke() throws Exception{ public Object invoke(Object obj) throws Exception{
- return Reflector.invokeInstanceMember(memberName, obj);
+ return Reflector.invokeInstanceMember(obj, memberName);
}
public Object invoke(Object obj, Object val) throws Exception{
diff --git a/src/jvm/clojure/lang/Reflector.java b/src/jvm/clojure/lang/Reflector.java index cbf0aa14..94a193c8 100644 --- a/src/jvm/clojure/lang/Reflector.java +++ b/src/jvm/clojure/lang/Reflector.java @@ -19,44 +19,42 @@ import java.util.List; public class Reflector{ -public static Object invokeInstanceMethod(String name, Object target, Object[] args) throws Exception - { +public static Object invokeInstanceMethod(Object target, String methodName, Object[] args) throws Exception{ Class c = target.getClass(); - List methods = getMethods(c, args.length, name,false); - return prepRet(invokeMatchingMethod(methods, target, args)); - } + List methods = getMethods(c, args.length, methodName, false); + return prepRet(invokeMatchingMethod(methods, target, args)); +} private static Object invokeMatchingMethod(List methods, Object target, Object[] args) - throws IllegalAccessException, InvocationTargetException { - if(methods.isEmpty()) - { - throw new IllegalArgumentException("No matching field or method found"); - } - else if(methods.size() == 1) - { - Method m = (Method) methods.get(0); - return prepRet(m.invoke(target, boxArgs(m.getParameterTypes(), args))); - } - else //overloaded w/same arity - { - for(Iterator i = methods.iterator(); i.hasNext();) - { - Method m = (Method) i.next(); + throws IllegalAccessException, InvocationTargetException{ + if(methods.isEmpty()) + { + throw new IllegalArgumentException("No matching field or method found"); + } + else if(methods.size() == 1) + { + Method m = (Method) methods.get(0); + return prepRet(m.invoke(target, boxArgs(m.getParameterTypes(), args))); + } + else //overloaded w/same arity + { + for(Iterator i = methods.iterator(); i.hasNext();) + { + Method m = (Method) i.next(); - Class[] params = m.getParameterTypes(); - if(isCongruent(params, args)) - { - Object[] boxedArgs = boxArgs(params, args); - return prepRet(m.invoke(target, boxedArgs)); - } - } - throw new IllegalArgumentException("No matching field or method found"); + Class[] params = m.getParameterTypes(); + if(isCongruent(params, args)) + { + Object[] boxedArgs = boxArgs(params, args); + return prepRet(m.invoke(target, boxedArgs)); + } + } + throw new IllegalArgumentException("No matching field or method found"); - } + } } -public static Object invokeConstructor(Class c, Object[] args) throws Exception - { +public static Object invokeConstructor(Class c, Object[] args) throws Exception{ Constructor[] allctors = c.getConstructors(); ArrayList ctors = new ArrayList(); for(int i = 0; i < allctors.length; i++) @@ -66,95 +64,114 @@ public static Object invokeConstructor(Class c, Object[] args) throws Exception ctors.add(ctor); } if(ctors.isEmpty()) - { - throw new IllegalArgumentException("No matching ctor found"); - } + { + throw new IllegalArgumentException("No matching ctor found"); + } else if(ctors.size() == 1) - { - Constructor ctor = (Constructor) ctors.get(0); - return ctor.newInstance(boxArgs(ctor.getParameterTypes(), args)); - } + { + Constructor ctor = (Constructor) ctors.get(0); + return ctor.newInstance(boxArgs(ctor.getParameterTypes(), args)); + } else //overloaded w/same arity - { - for(Iterator iterator = ctors.iterator(); iterator.hasNext();) - { - Constructor ctor = (Constructor) iterator.next(); - Class[] params = ctor.getParameterTypes(); - if(isCongruent(params, args)) - { - Object[] boxedArgs = boxArgs(params, args); - return ctor.newInstance(boxedArgs); - } - } - throw new IllegalArgumentException("No matching ctor found"); - } - } + { + for(Iterator iterator = ctors.iterator(); iterator.hasNext();) + { + Constructor ctor = (Constructor) iterator.next(); + Class[] params = ctor.getParameterTypes(); + if(isCongruent(params, args)) + { + Object[] boxedArgs = boxArgs(params, args); + return ctor.newInstance(boxedArgs); + } + } + throw new IllegalArgumentException("No matching ctor found"); + } +} + +public static Object invokeStaticMethodVariadic(String className, String methodName, Object... args) throws Exception{ + return invokeStaticMethod(className, methodName, args); -public static Object invokeStaticMethod(String name, String className, Object... args) throws Exception - { - Class c = Class.forName(className); - if(name.equals("new")) - return invokeConstructor(c, args); - List methods = getMethods(c, args.length, name,true); - return invokeMatchingMethod(methods, null, args); - } +} + +public static Object invokeStaticMethod(String className, String methodName, Object[] args) throws Exception{ + Class c = Class.forName(className); + if(methodName.equals("new")) + return invokeConstructor(c, args); + List methods = getMethods(c, args.length, methodName, true); + return invokeMatchingMethod(methods, null, args); +} -public static Object getStaticField(String name, String className) throws Exception - { - Class c = Class.forName(className); - Field f = getField(c, name,true); +public static Object getStaticField(String className, String fieldName) throws Exception{ + Class c = Class.forName(className); + Field f = getField(c, fieldName, true); if(f != null) { return prepRet(f.get(null)); } - throw new IllegalArgumentException("No matching field found"); - } + throw new IllegalArgumentException("No matching field found"); +} - public static Object setStaticField(String name, String className, Object arg1) throws Exception - { - Class c = Class.forName(className); - Field f = getField(c, name,true); +public static Object setStaticField(String className, String fieldName, Object val) throws Exception{ + Class c = Class.forName(className); + Field f = getField(c, fieldName, true); if(f != null) { - f.set(null, boxArg(f.getType(), arg1)); - return arg1; + f.set(null, boxArg(f.getType(), val)); + return val; + } + throw new IllegalArgumentException("No matching field found"); +} + +public static Object getInstanceField(Object target, String fieldName) throws Exception{ + Class c = target.getClass(); + Field f = getField(c, fieldName, false); + if(f != null) + { + return prepRet(f.get(target)); } - throw new IllegalArgumentException("No matching field found"); - } + throw new IllegalArgumentException("No matching field found"); +} -public static Object invokeInstanceMember(String name, Object target) throws Exception - { +public static Object setInstanceField(Object target, String fieldName, Object val) throws Exception{ + Class c = target.getClass(); + Field f = getField(c, fieldName, false); + if(f != null) + { + f.set(target, boxArg(f.getType(), val)); + return val; + } + throw new IllegalArgumentException("No matching field found"); +} + +public static Object invokeInstanceMember(Object target, String name) throws Exception{ //check for field first Class c = target.getClass(); - Field f = getField(c, name,false); + Field f = getField(c, name, false); if(f != null) //field get - { - return prepRet(f.get(target)); - } - return invokeInstanceMethod(name, target, RT.EMPTY_ARRAY); - } + { + return prepRet(f.get(target)); + } + return invokeInstanceMethod(target, name, RT.EMPTY_ARRAY); +} -public static Object invokeInstanceMember(String name, Object target, Object arg1) throws Exception - { +public static Object invokeInstanceMember(String name, Object target, Object arg1) throws Exception{ //check for field first Class c = target.getClass(); - Field f = getField(c, name,false); + Field f = getField(c, name, false); if(f != null) //field set { f.set(target, boxArg(f.getType(), arg1)); return arg1; } - return invokeInstanceMethod(name, target, new Object[]{arg1}); - } + return invokeInstanceMethod(target, name, new Object[]{arg1}); +} -public static Object invokeInstanceMember(String name, Object target, Object... args) throws Exception - { - return invokeInstanceMethod(name, target, args); - } +public static Object invokeInstanceMember(String name, Object target, Object... args) throws Exception{ + return invokeInstanceMethod(target, name, args); +} -static public Field getField(Class c, String name, boolean getStatics) - { +static public Field getField(Class c, String name, boolean getStatics){ Field[] allfields = c.getFields(); for(int i = 0; i < allfields.length; i++) { @@ -163,10 +180,9 @@ static public Field getField(Class c, String name, boolean getStatics) return allfields[i]; } return null; - } +} -static public List getMethods(Class c, int arity, String name, boolean getStatics) - { +static public List getMethods(Class c, int arity, String name, boolean getStatics){ Method[] allmethods = c.getMethods(); ArrayList methods = new ArrayList(); for(int i = 0; i < allmethods.length; i++) @@ -179,11 +195,10 @@ static public List getMethods(Class c, int arity, String name, boolean getStatic } } return methods; - } +} -static Object boxArg(Class paramType, Object arg) - { +static Object boxArg(Class paramType, Object arg){ Class argType = arg.getClass(); if(primBoxTypeMatch(paramType, argType)) return arg; @@ -213,10 +228,9 @@ static Object boxArg(Class paramType, Object arg) } else return arg; - } +} -static Object[] boxArgs(Class[] params, Object[] args) - { +static Object[] boxArgs(Class[] params, Object[] args){ if(params.length == 0) return null; Object[] ret = new Object[params.length]; @@ -227,10 +241,9 @@ static Object[] boxArgs(Class[] params, Object[] args) ret[i] = boxArg(paramType, arg); } return ret; - } +} -static public boolean primBoxTypeMatch(Class primType, Class boxType) - { +static public boolean primBoxTypeMatch(Class primType, Class boxType){ if(primType == int.class) return boxType == Integer.class; else if(primType == float.class) @@ -246,10 +259,9 @@ static public boolean primBoxTypeMatch(Class primType, Class boxType) else if(primType == byte.class) return boxType == Byte.class; return false; - } +} -static boolean isCongruent(Class[] params, Object[] args) - { +static boolean isCongruent(Class[] params, Object[] args){ boolean ret = false; if(args == null) return params.length == 0; @@ -281,12 +293,11 @@ static boolean isCongruent(Class[] params, Object[] args) } } return ret; - } +} -static Object prepRet(Object x) - { - if(x instanceof Boolean) - return ((Boolean)x).booleanValue()?RT.T:null; - return x; - } +static Object prepRet(Object x){ + if(x instanceof Boolean) + return ((Boolean) x).booleanValue() ? RT.T : null; + return x; +} } diff --git a/src/jvm/clojure/lang/StaticMemberInvoker.java b/src/jvm/clojure/lang/StaticMemberInvoker.java index ba5cf28b..27a72bf0 100644 --- a/src/jvm/clojure/lang/StaticMemberInvoker.java +++ b/src/jvm/clojure/lang/StaticMemberInvoker.java @@ -24,124 +24,135 @@ public Object call() throws Exception{ }
public Object invoke() throws Exception{
- return Reflector.invokeStaticMethod(memberName, className);
+ return Reflector.invokeStaticMethodVariadic(className, memberName);
}
public Object invoke(Object obj) throws Exception{
- return Reflector.invokeStaticMethod(memberName, className, obj);
+ return Reflector.invokeStaticMethodVariadic(className, memberName, obj);
}
public Object invoke(Object obj, Object val) throws Exception{
- return Reflector.invokeStaticMethod(memberName, className, obj, val);
+ return Reflector.invokeStaticMethodVariadic(className, memberName, obj, val);
}
public Object invoke(Object arg1, Object arg2, Object arg3) throws Exception{
- return Reflector.invokeStaticMethod(memberName, className, arg1, arg2, arg3);
+ return Reflector.invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4) throws Exception{
- return Reflector.invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4);
+ return Reflector.invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) throws Exception{
- return Reflector.invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5);
+ return Reflector.invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6) throws Exception{
- return Reflector.invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6);
+ return Reflector.invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7)
throws Exception{
- return Reflector.invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
+ return Reflector.invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8) throws Exception{
- return Reflector.invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
+ return Reflector.invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9) throws Exception{
- return Reflector.invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
+ return Reflector
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10) throws Exception{
return Reflector
- .invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9,
+ arg10);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11) throws Exception{
return Reflector
- .invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10,
- arg11);
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9,
+ arg10,
+ arg11);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12) throws Exception{
return Reflector
- .invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10,
- arg11, arg12);
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9,
+ arg10,
+ arg11, arg12);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13)
throws Exception{
return Reflector
- .invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10,
- arg11, arg12, arg13);
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9,
+ arg10,
+ arg11, arg12, arg13);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14)
throws Exception{
return Reflector
- .invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10,
- arg11, arg12, arg13, arg14);
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9,
+ arg10,
+ arg11, arg12, arg13, arg14);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15) throws Exception{
return Reflector
- .invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10,
- arg11, arg12, arg13, arg14, arg15);
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9,
+ arg10,
+ arg11, arg12, arg13, arg14, arg15);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15, Object arg16) throws Exception{
return Reflector
- .invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10,
- arg11, arg12, arg13, arg14, arg15, arg16);
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9,
+ arg10,
+ arg11, arg12, arg13, arg14, arg15, arg16);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15, Object arg16, Object arg17) throws Exception{
return Reflector
- .invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10,
- arg11, arg12, arg13, arg14, arg15, arg16, arg17);
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9,
+ arg10,
+ arg11, arg12, arg13, arg14, arg15, arg16, arg17);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15, Object arg16, Object arg17, Object arg18) throws Exception{
return Reflector
- .invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10,
- arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18);
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9,
+ arg10,
+ arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
Object arg15, Object arg16, Object arg17, Object arg18, Object arg19) throws Exception{
return Reflector
- .invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10,
- arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19);
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9,
+ arg10,
+ arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19);
}
public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
@@ -149,8 +160,9 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object Object arg15, Object arg16, Object arg17, Object arg18, Object arg19, Object arg20)
throws Exception{
return Reflector
- .invokeStaticMethod(memberName, className, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10,
- arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20);
+ .invokeStaticMethodVariadic(className, memberName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9,
+ arg10,
+ arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20);
}
|