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: 4611 $
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()==Class.class?(Class) owner:owner.getClass();
026
027 maximumNumberOfParameters = 0;
028
029 Method[] methods = (Method[]) AccessController.doPrivileged(new PrivilegedAction() {
030 public Object run() {
031 return clazz.getMethods();
032 }
033 });
034 for (int j = 0; j < methods.length; j++) {
035 if (method.equals(methods[j].getName()) && methods[j].getParameterTypes().length > maximumNumberOfParameters) {
036 maximumNumberOfParameters = methods[j].getParameterTypes().length;
037 }
038 }
039 methods = (Method[]) AccessController.doPrivileged(new PrivilegedAction() {
040 public Object run() {
041 return clazz.getDeclaredMethods();
042 }
043 });
044 for (int j = 0; j < methods.length; j++) {
045 if (method.equals(methods[j].getName()) && methods[j].getParameterTypes().length > maximumNumberOfParameters) {
046 maximumNumberOfParameters = methods[j].getParameterTypes().length;
047 }
048 }
049
050 }
051
052 public String getMethod() {
053 return method;
054 }
055
056 protected Object doCall(Object arguments) {
057 return InvokerHelper.invokeMethod(getDelegate(), method, arguments);
058 }
059
060 public Object getProperty(String property) {
061 if ("method".equals(property)) {
062 return getMethod();
063 } else return super.getProperty(property);
064 }
065 }