1

我正在尝试有效地搜索天气,子类实现了一个方法,我在一个名为_szMethodName. 我可以通过做得到子类实现的所有方法的数组Method[] _arrClassMethodsList = class.getMethods();。然后,我可以将该方法的名称与我正在寻找的函数的 stringName 进行比较,以确定天气或该类是否实现了该特定方法。目前我在 for 循环中工作,但随着子类的增长,这会变慢。

For循环实现:

for (Method method : class.getMethods()){
       if(method.getName().equals(_szMethodName)){
          //method exists in subclass
          break;
      }
}

来自的方法数组 class.getMethods()按字母顺序排序。(仅在 Java >=7 中)。我希望我可以通过在数组上使用二进制搜索或其他一些优化而不是使用 for 循环来利用这一点。但是,我还没有弄清楚如何在数组上实现 Java 的二进制搜索功能。我曾尝试使用比较器或比较器,但尚未成功。我最近的比较器实现如下,但有一些我还不能解决的错误。

当前使用比较器的尝试:

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);

任何有关如何使其工作的帮助或示例将不胜感激。谢谢!

4

2 回答 2

5

你为什么不使用方法http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getMethod%28java.lang.String,%20java.lang.Class.. .%29直接获取方法(如果可用)并让 JVM 有效地为您完成工作?

顺便说一句,getMethods 的文档说:“返回的数组中的元素没有排序,也没有任何特定的顺序”。二进制搜索需要排序的数据。这意味着您首先需要对数组进行排序。

注意:您应该查看可能符合您期望的方法getMatchingAccessibleMethod 。

于 2013-02-20T15:06:28.127 回答
0

似乎唯一真正的方法是重新实现二分搜索,在搜索过程中提取方法名称。我的最终实现如下。谢谢各位的帮助。

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];
    }               
}
于 2013-02-22T19:48:54.517 回答