我正在努力有效地搜索子类是否实现了一个名为_szMethodName
的字符串中的方法。我可以通过执行Method[] _arrClassMethodsList = class.getMethods();
来获得子类实现的所有方法的数组。然后,我可以将方法的名称与我要查找的函数的字符串名称进行比较,以确定类是否实现该特定方法。目前,我在for循环中处理这个问题,但随着子类的增长,速度会变慢。
对于环路实施:
for (Method method : class.getMethods()){
if(method.getName().equals(_szMethodName)){
//method exists in subclass
break;
}
}
(仅限Java>=7版本)。我希望我可以通过在数组上使用二进制搜索或其他优化来利用这一点,而不是使用for循环。然而,我还不知道如何在数组上实现Java的二进制搜索功能。我尝试过使用comparator和comparative,但尚未成功。下面是我最近使用的比较器,但有一些错误我尚未解决。class.getMethods()
中的方法数组按字母顺序排序
使用比较器的当前尝试:
Comparator<Method> c = new Comparator <Method>() {
public int compare(Method method, String string) {
return method.getName().compareTo(string);
}
};
Method[] _arrClassMethodsList = class.getMethods();
int index = Arrays.binarySearch(_arrClassMethodsList, _szMethodName, c);
任何关于如何使其发挥作用的帮助或例子都将不胜感激。谢谢
为什么不使用该方法http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getMethod%28java.lang.String,%20java.lang.Class…%29直接获取该方法(如果可用),并让JVM高效地为您完成工作?
顺便说一句,getMethods的文档说:"返回的数组中的元素没有排序,并且没有任何特定的顺序"。二进制搜索需要排序的数据。这意味着您首先需要对数组进行排序。
注意:您应该看看getMatchingAccessibleMethod方法,它可能会达到您的预期。
似乎唯一真正的方法是重新实现二进制搜索,在搜索过程中提取方法名称。我的最终实现如下。谢谢大家的帮助。
public final Method NOT_FOUND = null;
private Method findMethodInDelegateClassWithParameters (String _szMethodName)
{
@SuppressWarnings("rawtypes")
Class _cDelegateClass = m_oDelegate.getClass();
//Get and sort array for binary search if not done, ensure methods are alphabetical before Java 7
if (_arrSortedMethods==null){
_arrSortedMethods = _cDelegateClass.getMethods();
Arrays.sort(_arrSortedMethods, new Comparator<Method>() {
public int compare(Method m1, Method m2) {
return m1.getName().compareTo(m2.getName());
}
});
}
return binarySearchForMethodNamed(_arrSortedMethods, _szMethodName);
}
public Method binarySearchForMethodNamed(Method[] _arrMethods, String _szMethodName) {
int left = 0;
int right = _arrMethods.length - 1;
return binarySearchMethods(_arrMethods, _szMethodName, left, right);
}
private Method binarySearchMethods(Method[] _arrMethods, String _szMethodName, int left, int right) {
if (right < left) {
return NOT_FOUND;
}
int mid = (left + right) >>> 1;
String _szArrayMethodName = _arrMethods[mid].getName();
if (_szMethodName.compareTo(_szArrayMethodName)>0) {
return binarySearchMethods(_arrMethods, _szMethodName, mid + 1, right);
} else if (_szMethodName.compareTo(_szArrayMethodName)<0) {
return binarySearchMethods(_arrMethods, _szMethodName, left, mid - 1);
} else {
return _arrMethods[mid];
}
}