リフレクションAPIを経由してアクセスオーバーロードされたメソッド

user683224:

リフレクションなどを使用してクラスオーバーロードされたメソッドを区別する方法:

method() そして method(int arg)

void invoke(Object object, String methodName, int id) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
        object.getClass().getDeclaredMethod(methodName).invoke(object, int.class);
}

そして、この関数の呼び出し:

getV(new Object(), "method", 33);

そして、それはエラーを返すjava.lang.IllegalArgumentException: wrong number of arguments引数なしのメソッドがデフォルトで選びましれる平均ことを。私はそれが動作するパラメータINTなしでメソッドを呼び出した場合。私はオーバーロードされたメソッドのを区別するためにどのように頼みますか?私はのためにドキュメントを読んだClass.getDeclaredMethod https://docs.oracle.com/javase/8/docs/api/java/lang/Class.htmlまたSO上の古い投稿がありますが、両方のソースが同じ質問に答えるされていない方法をJavaでオーバーロードされたメソッドを見つけるには?Class.Object勿論私はちょうど例のためにそれを使用する名前のメソッドを持つメソッドを持っているdosen't。

ホルガー:

あなたは、ルックアップ法ではなく、呼び出しメソッドにパラメータ型を指定する必要があります。

void invoke(Object object, String methodName, int id) throws ReflectiveOperationException {
    object.getClass().getDeclaredMethod(methodName, int.class).invoke(object, id);
}

しかし、ことを心に留めておくgetClass()リターンのに対し、意図したクラスのサブクラスである可能性があり、実際のクラス、getDeclaredMethodさがすスーパーにはないが。getMethodスーパークラスを検索していますが、唯一の考慮public方法を。

方法は見つかっていないとき、型階層内の非パブリックメソッドを検討するには、スーパークラスをループに自分自身を持っているでしょう。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=363853&siteId=1