001 /*
002 @license.text@
003 */
004 package biz.hammurapi.eval;
005
006 import java.lang.reflect.InvocationTargetException;
007 import java.lang.reflect.Method;
008
009
010 public class MethodEntry {
011 Object object;
012 Method method;
013 String name;
014
015 public MethodEntry(Object object, Method method) {
016 super();
017 this.object = object;
018 this.method = method;
019 this.name = method.getName();
020 }
021
022 public MethodEntry(Object object, Method method, String name) {
023 super();
024 this.object = object;
025 this.method = method;
026 this.name = name;
027 }
028
029 Object invoke(Object[] args) throws EvaluationException {
030 try {
031 return method.invoke(object, args);
032 } catch (IllegalAccessException e) {
033 throw new EvaluationException(e);
034 } catch (InvocationTargetException e) {
035 throw new EvaluationException(e);
036 }
037 }
038
039 /**
040 * @param otherEntry
041 * @return 0 - neither is more specific, 1 - this one is more specific
042 * -1 - the other one is more specific.
043 */
044 int isMoreSpecific(MethodEntry otherEntry) {
045 Class[] otherTypes = otherEntry.method.getParameterTypes();
046 Class[] types = method.getParameterTypes();
047 if (otherTypes.length!=types.length) {
048 return 0;
049 }
050
051 for (int i=0; i<types.length; i++) {
052 if (types[i].equals(otherTypes[i])) {
053 continue;
054 } else if (types[i].isAssignableFrom(otherTypes[i])) {
055 return -1;
056 } else if (otherTypes[i].isAssignableFrom(types[i])) {
057 return 1;
058 }
059 }
060
061 return 0;
062 }
063 }