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 }