Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

リフレクションでメソッドを取得したい

はじめまして。

    public static Method getMethod(Object instance, String methodName, Object[] parameters){
        //Method情報を取得
        Method method = null; //戻り値を保持する変数
            
        //引数の変換
                
        Class[] params;
            int i = 0;
            params = new Class[parameters.length];
            for(Object param: parameters){
                params[i] = param.getClass();
                i++;
            }
        //メソッドの取得
        try{
            method = instance.getClass().getMethod(methodName, params);
            return method;
        }catch(NoSuchMethodException e){
            
            throw new RuntimeException("インスタンス名=" + instance.getClass().getName() + " メソッド名=" + methodName + " メソッドが見つかりませんでした。");
        }
    }

少し分りにくいかもしれませんが。。
引数のObject[] parametersは何の型か分りません。
Stringかもしれないし、int,long,自作クラスかもしれません。
その為Class型のクラスを取得しなければならないと思うのですが、
params[i] = param.getClass();
とするとString型はうまくいくのですがintやlong型だとメソッドを見つけることができないみたいです。
params = new Class[]{int.class};
とすると取得できるみたいですが・・・
if()・・・で分岐させてClass型を格納していく以外に方法はないでしょうか?

宜しくお願いします。

4

回答

3123

閲覧

4件の回答

評価

0

intやlongはObjectじゃないでしょ。

評価

0


int.class -> Integer.class
にする方法はのっていたのですが

Integer.class -> int.class 
の方法は見当たりませんねぇ・・・

評価

0

要は、引数として渡す値の型でメソッドを呼び出したいんでしょ?

parameters[n]の中身がnullだと判断できないよね。
で、Object[]の中身にはintとか入れれないから、
Integerにして渡す必要があるけど、
メソッドはオーバーロードできるから、
void foo(int i)とvoid foo(Integer i)が区別できない。

だから、値だけでメソッドを探すのは、一意に定まらない。
方法論としては、getMethodsでメソッドを全て取得して、
名前が同じかつ、引数の数が同じかつ、
引数のパターンが同じと判断できるものを探すしかない。

値のnullなら型チェックはスルーして、ラッパー型ならプリミティブ型もしくはラッパー型で、
一致するかどうかを判断するという、
結構めんどい処理になるよ。前に実装したことあるけど。

評価

0

というか、その前になんでそんなコードが必要なの?
実験と言うならそれまでだけど。

どうせ引数型チェックは必要なんだから、すでに書いてあるように実際に存在するメソッドを主に考えるしかない。
最初にメソッドを全部static配列に突っ込んでおく。
毎度リフレクションを使わなくていい分マシにはなる。

引数型をうまく一つのStringにしてMapのキーにしてやると、毎回の判定を無くすことも考えられるな。
Stringを作り出すのは毎回になるけど。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。