5

コード内の最も重要なセクションを除いて、どこでも自由に使用できる最新のJVMでリフレクションのコストが下がったかどうかを知りたいです。

たとえば、ユーザーが入力として指定したメソッド名に基づいてメソッドを呼び出したい場合です。これを実装するには、次の2つの方法があります。

  1. if / else / switchを使用して、呼び出すメソッドを決定します。ケースが多い場合、これは明らかに多くのコードになります。

  2. リフレクションを使用してメソッドを呼び出します。これは間違いなく少ないコードです。

明確化:上記は、リフレクションを使用するとコードの量を短縮できる例にすぎません。大量の静的コードをリフレクションマジックに置き換えることが有効な戦略であるかどうかを知りたかっただけです。同様の行で何かをした場合も、経験を共有してください。

4

3 に答える 3

4

いいえ、私の意見では、それを行う別の方法があります。コマンドパターンと名前/コマンドインスタンスのペアのマップを使用します。スイッチや反射なしで、非常に長い距離をスケーリングできます。それも多形であり、はるかに「オブジェクト指向」です。

java.lang.Runnableまたはjava.util.concurrent.Callable、独自のコマンドを使用したくない場合は、をご覧ください。必要に応じて、メソッドを非同期で実行できます。

ユーザーがどのメソッドを呼び出すかをどのように指定するかは私にはわかりません。リフレクションを使用する場合は、クラスの名前、メソッド、パラメーターを詳しく説明し、戻り値のタイプを知っている必要があります。どのように彼らに可能な選択肢を示すつもりですか?アプリケーションのすべてのクラス、すべてのメソッド?公正なゲームはありますか?

簡単に指定して呼び出すことができるように規定された選択肢のリストを提示する方がはるかに合理的だと思います。リフレクションに基づくソリューションがその基準を満たしているとは思いません。

あなたはユーザーに選択肢を提供したいのですが、「何でもいい」というのは私には実用的ではないようです。

以下に示す具体的な例として、Spring Controllerとサービスが含まれていますが、リフレクションは使用しません。ユーザーがHTTPクエリパラメーターを渡して開始または停止を指定する場合は、RESTを使用して、個々のコントローラーメソッドを念頭に置いている特定のURLにマップすることをお勧めします。私の好みは、たとえそれがより冗長であっても、明快さです。

于 2012-05-30T09:24:21.547 に答える
0

ダウンしたとしても、ダイレクト メソッド呼び出し/フィールド アクセスと比較して、依然として大幅に低速です。しかし、あなたの場合、JVM は最近非常に高速であるため、実際には問題になりません。そのような質問を正当化する目に見えるパフォーマンスへの影響はありますか? また、ここでの副次的な被害は、静的な型チェックの良さをすべて失うことであることを認識してください。

于 2012-05-30T09:25:51.133 に答える
0

リフレクティブ メソッド呼び出しの 2 つのステップを区別する必要があります。メソッド ルックアップ (低速) とメソッド呼び出し (非常に高速) です。したがって、インスタンスをキャッシュしMethod、高速なルックアップ ソリューションを用意するだけで十分です。そうすれば、お互いに有利な解決策が得られます。

于 2012-05-30T09:33:00.417 に答える