原始的な引数を持つメソッドを呼び出すためにリフレクションを使用する方法?

リンドストーム:

私は、メソッド作成しようとしていますinvokeMethod(String methodName, Object...args)現在のインスタンス上のスーパークラスからメソッドを呼び出します。私は、次の実装を試してみました。

    public void invokeMethod(String methodName, Object...args) {
        //Array to hold the classes of the arguments
        Class<?>[] classes = new Class<?>[args.length]; 
        //Initialize each class in the array to the class of each argument 
        for(int i = 0; i < args.length; i++)
            classes[i] = args[i].getClass();
        try {
            //find the method
            Method m = this.getClass().getMethod(methodName, classes);
            //invoke the method
            m.invoke(this, args);
        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }

この実装での問題は、私は原始的なパラメータを持つメソッドを呼び出すようにしようと、私が手にあるNoSuchMethodExceptionそれはタイプラッパークラスと同等であるパラメータを持つメソッドを探しているので。

私は署名してメソッドを呼び出すしようとした場合たとえば、line(float, float, float, float)試みることによってinvokeMethod("line", 50f, 50f, 50f, 50f)、私は次のように例外を取得します

java.lang.NoSuchMethodException: DynamicSketch.line(java.lang.Float, java.lang.Float, java.lang.Float, java.lang.Float)
at java.base/java.lang.Class.getMethod(Class.java:2109)
at DynamicSketch.invokeMethod(DynamicSketch.java:32)
at DynamicSketch.setup(DynamicSketch.java:19)
at processing.core.PApplet.handleDraw(PApplet.java:2412)
at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1557)
at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:316)

私の作るためにとにかくそこにあるinvokeMethodプリミティブの引数を持つメソッドの仕事を?

編集:解決策ここでは、私は私の方法を実行する際にプリミティブ型が署名している内容を正確に把握していないので、仕事をしません。私のような方法で実行できるようにしたいsize(int, int)line(float, float ,float ,float)私の方法を使用して、リンク内の溶液を簡単にでは動作しません。これまで私が見る唯一の解決策は、スーパークラス内のすべての可能な方法のためのif文を定義して、リンクにソリューションを使用しているが、私はあまり面倒な方法を求めていました。

スイーパー:

以下のような引数のとき10かを10.0fメソッドに渡されたパラメータの種類があるので、彼らは自動的に、ラップされていますObject...

したがって、これらのラッパー型をチェックし、それらをアンラップする必要があります。あなたのforループは次のようになります。

for(int i = 0; i < args.length; i++) {
    if (args[i].getClass() == Integer.class) {
        classes[i] = int.class;
    } else if (args[i].getClass() == Float.class) {
        classes[i] = float.class;
    } else if (args[i].getClass() == Double.class) {
        classes[i] = double.class;
    } else {
        classes[i] = args[i].getClass();
    }
}

私はあなたが他の5自分自身を追加することができ、ここでは3例が追加されました。

あなたは今、ラッパ型引数を持つメソッドを呼び出すことはできませんことをこの意味。あなたは同様にそれらを呼び出したい場合は、以下を行う必要があり

  1. すべてのラッパー型アンラップ
  2. これらの非ラッパー型を持つメソッドを探してみてください
  3. 見つからない場合は、再びそれらを包みます
  4. ラッパー型を使用して、Aの方法を見つけます。

編集:

ホルガーはコメントで示唆したように、あなたはまた、JVMが使用することによって、あなたのための適切な方法を見つけてみましょうことができます

new Statement(this, methodName, args).execute();

以下のためのドキュメントStatementクラス。

おすすめ

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