package reflect;
import java.lang.reflect.Method;
public class ReflectionUtils {
private static Method[] methodCache;
public static Method getMethod(Class<?> cl, String name,
Class<?>... parameterTypes) {
short index = getMethodIndex(cl, name, parameterTypes);
short numberOfMethods = MethodInfo.getNumberOfMethods();
if (index != -1) {
try {
Method m = getCachedMethod(index, numberOfMethods);
if (m == null) {
m = Method.class.newInstance();
writeMethodIndex(m, index);
setMethodCache(m, index);
}
return m;
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
return null;
}
return null;
}
public static short getMethodIndex(Class<?> cl, String name,
Class<?>... parameterTypes) {
short numberOfMethods = MethodInfo.getNumberOfMethods();
while (true) {
String className = cl.getName();
for (short index = 0; index < numberOfMethods; index++) {
MethodInfo mInfo = MethodInfo.getMethodInfo(index);
String currentName = mInfo.getName(index);
if (currentName.startsWith(className)
&& currentName.endsWith(name)) {
if (currentName.length() == className.length()
+ name.length() + 1) {
if (mInfo.numArgs == parameterTypes.length) {
return index;
}
}
}
}
cl = cl.getSuperclass();
if (cl == Object.class) {
return -1;
}
}
}
private static class MethodObjectInfo extends ObjectInfo {
private short shortValue;
public short getShort(short offset) {
short s;
address.add((offset * 2) - 4);
s = shortValue;
address.sub((offset * 2) - 4);
return s;
}
public void setShort(short offset, short value) {
address.add((offset * 2) - 4);
shortValue = value;
address.sub((offset * 2) - 4);
}
}
static MethodObjectInfo objectInfo;
private static void writeMethodIndex(Method m, short index) {
if (objectInfo == null) {
objectInfo = new MethodObjectInfo();
}
objectInfo.setAddress(ObjectInfo.getAddress(m));
objectInfo.setShort((short) 0, index);
}
public static short readMethodIndex(Method m) {
if (objectInfo == null) {
objectInfo = new MethodObjectInfo();
}
objectInfo.setAddress(ObjectInfo.getAddress(m));
return objectInfo.getShort((short) 0);
}
private static void setMethodCache(Method m, short index) {
methodCache[index] = m;
}
private static Method getCachedMethod(short index, short numberOfMethods) {
if (methodCache == null) {
methodCache = new Method[numberOfMethods];
}
return methodCache[index];
}
}