001 package org.codehaus.groovy.runtime;
002
003 import java.lang.reflect.Method;
004 import java.security.AccessController;
005 import java.security.PrivilegedAction;
006
007 import groovy.lang.Closure;
008
009
010 /**
011 * Represents a method on an object using a closure which can be invoked
012 * at any time
013 *
014 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
015 * @version $Revision: 1.11 $
016 */
017 public class MethodClosure extends Closure {
018
019 private String method;
020
021 public MethodClosure(Object owner, String method) {
022 super(owner);
023 this.method = method;
024
025 final Class clazz = owner.getClass();
026 maximumNumberOfParameters = 0;
027
028 Method[] methods = (Method[]) AccessController.doPrivileged(new PrivilegedAction() {
029 public Object run() {
030 return clazz.getMethods();
031 }
032 });
033 for (int j = 0; j < methods.length; j++) {
034 if (method.equals(methods[j].getName()) && methods[j].getParameterTypes().length > maximumNumberOfParameters) {
035 maximumNumberOfParameters = methods[j].getParameterTypes().length;
036 }
037 }
038 methods = (Method[]) AccessController.doPrivileged(new PrivilegedAction() {
039 public Object run() {
040 return clazz.getDeclaredMethods();
041 }
042 });
043 for (int j = 0; j < methods.length; j++) {
044 if (method.equals(methods[j].getName()) && methods[j].getParameterTypes().length > maximumNumberOfParameters) {
045 maximumNumberOfParameters = methods[j].getParameterTypes().length;
046 }
047 }
048
049 }
050
051 public String getMethod() {
052 return method;
053 }
054
055 protected Object doCall(Object arguments) {
056 return InvokerHelper.invokeMethod(getDelegate(), method, arguments);
057 }
058
059 public Object getProperty(String property) {
060 if ("method".equals(property)) {
061 return getMethod();
062 } else return super.getProperty(property);
063 }
064 }