2

jsp から、スイッチに使用できる文字列を取得します

switch(value)
case 0: method0(); break;
case 1: method1(); break;
...

または反射の場合:

c.getMethod("method"+value, parameter);
...

どちらのアプローチがより効率的ですか?

4

7 に答える 7

4

追加のレイヤーを通過する必要があるため、反射は明らかに高速ではありません。

ただし、このようなタスクにリフレクションを使用するのは間違った方法です。コードの保守が難しくなり、リフレクションが設計された本来の目的を果たせなくなるからです。

于 2013-06-17T10:40:13.503 に答える
2

メソッドの数が決まっていて、 1000 個の異なるsを入力するのが面倒な場合は、間違いなく を使用します。そのステートメントは JVM バイトコード レベルで高度に最適化されているためです。caseswitch

メソッドの数が無数にある場合は、リフレクションを使用できます(おそらく他に選択肢はありません)。それでも、取得したインスタンスをキャッシュするMethodことでプロセスを高速化できますgetMethod()

リフレクションを介して引数を渡すと、常にClasses とObjects の余分な配列が作成されることに注意してください。

于 2013-06-17T10:54:05.643 に答える
1

リフレクションには常にいくらかのオーバーヘッドがあります

javadocから

リフレクションには動的に解決される型が含まれるため、特定の Java 仮想マシンの最適化は実行できません。したがって、リフレクト操作は、リフレクション操作を行わない操作よりもパフォーマンスが低下するため、パフォーマンスが重視されるアプリケーションで頻繁に呼び出されるコードのセクションでは避ける必要があります。

于 2013-06-17T10:39:37.640 に答える
1

より速いパフォーマンスを求めている場合、リフレクションには大きなオーバーヘッドがあります。Oracle Javaチュートリアルによると:

リフレクションには動的に解決される型が含まれるため、特定の Java 仮想マシンの最適化は実行できません。したがって、リフレクト操作は、リフレクション操作を行わない操作よりもパフォーマンスが低下するため、パフォーマンスが重視されるアプリケーションで頻繁に呼び出されるコードのセクションでは避ける必要があります。

lookupswitchJava VM には、 やのような大文字と小文字の切り替えに使用できる特別なバイトコードがありtableswitchます。

実装できる場合の最善のアプローチは、オブジェクト指向アプローチであるポリモーフィズムです。

于 2013-06-17T10:38:50.277 に答える
0

スイッチを使用

リフレクションは強力ですが、むやみに使うべきではありません。リフレクションを使用せずに操作を実行できる場合は、リフレクションを使用しないことをお勧めします。

http://docs.oracle.com/javase/tutorial/reflect/index.html

于 2013-06-17T10:39:24.277 に答える
0

メモリに比べてリフレクションが重いため、switch オプションを使用することをお勧めします。また、リフレクション中に switch ステートメントで処理できるように使用できない場合は、入力の例 * があるため、使用できないメソッド method* を探すことができます。

于 2013-06-17T10:39:41.823 に答える
-1

基本的に、いつリフレクションを使用するかを最初に理解しますか?型のインスタンスを動的に作成する、型を既存のオブジェクトにバインドする、または既存のオブジェクトから型を取得するためのリフレクションに主に使用されます。その後、型のメソッドを呼び出したり、そのフィールドやプロパティにアクセスしたりできます。

しかし、ここではそのようなケースはありませんので、リフレクションの代わりにswitch を使用することをお勧めします。

また、プロセスの不要な負担を回避します。

于 2013-06-17T10:45:58.367 に答える