2013-07-30 3 views
19

したがって、Method m = plugin.getClass().getDeclaredMethod("getFile");を使用してクラスからメソッドを取得しようとしています。.getDeclaredMethodを使用して別のクラスを拡張するメソッドからメソッドを取得する

しかし、pluginクラスは、getFileメソッドを持つクラスである別のクラスを拡張しています。私はそれがNoSuchMethodExceptionの例外をスローするかどうかはわかりません。

私はpluginが拡張しているクラスがgetFileメソッドを持っていることを知っています。 申し訳ありませんが混乱して聞こえる場合は、少し疲れています。

答えて

55

getDeclaredMethodの代わりにgetMethodを使用する必要があるようです。このClassオブジェクトが表すクラスまたはインタフェースの指定された宣言メソッドをリフレクトするMethodオブジェクトを返します

getDeclaredMethodの全体のポイントは、それ だけは、あなたが上でそれを呼び出しているクラスで宣言されているメソッドを見つけることです。 getMethod一方

を有する:

Cは、任意のマッチング方法を探索します。一致するメソッドが見つからない場合は、ステップ1のアルゴリズムのみしかしパブリック方法を見出すであろうC.

のスーパークラスに再帰的に呼び出されます。あなたは後にしている方法は、公開されていない場合は、階層内の各クラスにgetDeclaredMethodまたはgetDeclaredMethodsを使用して、クラス階層を自分でアップ再帰する必要があります

Class<?> clazz = plugin.getClass(); 
while (clazz != null) { 
    Method[] methods = clazz.getDeclaredMethods(); 
    for (Method method : methods) { 
     // Test any other things about it beyond the name... 
     if (method.getName().equals("getFile") && ...) { 
      return method; 
     } 
    } 
    clazz = clazz.getSuperclass(); 
} 
+0

+1、私が持っていたよりも、よりよい解決策を。 – rgettman

+0

助けがあれば、私がこれを使用している理由は、方法がプライベートであるためです。あなたは編集します。さて、私は編集をしようとします。 – PaulBGD

+0

@Ultimate:そうです、それはかなり重要です。もしあなたがそれを最初に言及しておけば、それは助けになるでしょう。 –

関連する問題