のようなものを書くとき
doit(43, 44, "hello");
コンパイラは、どのオーバーロードされたメソッドが呼び出されるかを認識しています。リフレクションで同じことをしたいときは、自分自身を知る必要があります。
doit(Integer, double, CharSequence...);
のようなものを介してそれを取得します
Class[] types = {Integer.class, double.class, CharSequence[].class};
declaringClass.getDeclaredMethod("doit", types);
ただ書くことができる何かがすでにあるのだろうか
Method m = getMethod(declaringClass, "doit", 43, 44, "hello");
JLSはこの点で少し複雑なので、誰かがすでにこれを行ったのではないかと思います。
実際、フェーズ1のように、コンパイラーとまったく同じように動作することは不可能です。コンパイラーは、ボックス化とボックス化解除を行わずに一致するメソッドのみを受け入れます。上から私の仮説を呼び出すとき、プリミティブとそのラッパーの区別はすでに失われています(varargsを介して引数を渡すときの自動ボクシングのため)。この問題には解決策がないようですので、無視しましょう。getMethod
答えで示唆されているように、BeanUtils.invokeMethod
近づいています。それが何を意味するにせよ、それは最良の一致を見つけることになっています。MethodUtils.getMatchingAccessibleMethod
を見ると、
- varargsについては何も知りません
- それは非決定論的です
だから私はもっと良いものを探しています。