1 28 29 package com.caucho.es.wrapper; 30 31 import com.caucho.es.Call; 32 import com.caucho.es.ESBase; 33 import com.caucho.es.ESNull; 34 35 39 public class MethodDispatcher { 40 private Class [][]parameterTypes; 41 42 public MethodDispatcher(Class [][]parameterTypes) 43 { 44 this.parameterTypes = parameterTypes; 45 } 46 47 50 public int select(Call call, int length) 51 throws Exception 52 { 53 int bestCost = Integer.MAX_VALUE; 54 int bestMethod = -1; 55 56 for (int i = 0; i < parameterTypes.length; i++) { 57 Class []parameters = parameterTypes[i]; 58 59 int cost = 0; 60 for (int j = 0; j < parameters.length; j++) { 61 ESBase obj = call.getArg(j, length); 62 Class cl = obj.getJavaType(); 63 Class param = parameters[j]; 64 65 if (cl.equals(param)) 66 continue; 67 68 else if (param.isAssignableFrom(cl)) 70 cost += 10; 71 72 else if (obj instanceof ESNull) 73 cost += 50; 74 75 else if (cl.equals(void.class)) 76 cost += 50; 77 78 else if (cl.isPrimitive() && param.isPrimitive()) 79 cost += 100; 80 81 else { 82 cost = Integer.MAX_VALUE; 83 break; 84 } 85 } 86 87 if (cost < bestCost) { 88 bestMethod = i; 89 bestCost = cost; 90 } 91 } 92 93 return bestMethod; 94 } 95 } 96 97 | Popular Tags |