0

Android アプリケーション用の Java ユニット コンバーターを構築しています。私はユーザーにさまざまな単位変換を提供しています。最終的には合計 220 の変換が可能になり、一方向だけを数えると 110 になります。IE メートル -> フィートとフィート -> メートルは、2 つの異なる変換になります。

現時点では、変換ごとに小さなメソッドを作成することを計画しているため、合計で 220 個です (時間がかかるとはいえ、これがおそらく最も簡単な方法だと思います)。今私の質問は、2 つの変数 (convertFrom と convertTo) を設定したら、適切なメソッドを動的に呼び出すことができるかどうかを知りたいですか? if/else if ブロックを作成することもできましたが、それは途方もない量のコードになるだけであり、上記の 2 つの変数に基づいて正しいメソッドを呼び出すためのより良い方法があることを望んでいました。何かアドバイス?

PSここにコードがなくて申し訳ありません。私はここで始めたばかりで、これの計画段階にあります。

4

3 に答える 3

0

一般的な考え方としては、次のようなことができます。

//invoking a static method (no instance is required)
public Object invoke(final Class<?> clazz, final String name, final Class<?>[] paramTypes, final Object[] args){
    return invoke(null, name, paramTypes, args);
}

//invoking a method on an object (instance is required)
public Object invoke(final Object instance, final Class<?> clazz, final String name, final Class<?>[] paramTypes, final Object[] args) throws Exception{
    assert clazz != null && name != null : "clazz || method == null";
    assert paramTypes.length == args.length : "paramTypes.length != args.length";
    Method method;
    try{
        //to check if the method has been overridden or not
        method = clazz.getDeclaredMethod(name, paramTypes);
    }catch(NoSuchMethodException | SecurityException ex){
        //if method doesn't exist, exception is thrown
        method = clazz.getMethod(name, paramTypes);
    }
    //if method is protected or private
    if(!method.isAccessible())
        method.setAccessible(true);
    return method.invoke(instance, args);
}

呼び出そうとしているメソッドにパラメーターがない場合は、空を渡しますClass<?>[](空以外の引数についても同様ですObject[])。このメソッドから返されるオブジェクトは、呼び出されたばかりのメソッドの結果です。voidメソッドに戻り値の型 ( )がない場合は、nullが返されます。アイデアは、基本的に、結果を期待どおりのものにキャストすることです。

于 2013-08-23T03:26:41.400 に答える