1

サブクラスが実装する天気を効率的に検索しようとしています_szMethodName. を実行することで、サブクラスが実装するすべてのメソッドの配列を取得できますMethod[] _arrClassMethodsList = class.getMethods();。次に、メソッドの名前を探している関数の stringName と比較して、天気を判断するか、クラスがその特定のメソッドを実装していないかを判断します。現在、これは 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 に答える