Javaのリフレクションとは何ですか?
このような動的なオブジェクトを取得する方法と動的呼び出し、任意のオブジェクトのために、方法のいずれかであることができ、それを呼び出し、Javaリフレクション機構は、任意のクラスのために、それらはすべてこのクラスのプロパティとメソッドに知らされている、動作状態にあります機能は、Javaのリフレクション・メカニズムと呼ばれています。
何が反射したシーンを適用しますか?
- あなたはプラグインソフトをインストールすることができる機能を作るとき、あなたも、あなたは、このオブジェクトをインスタンス化方法がわからないプラグの名前を入力しますか?プログラムは、開発が知られていない場合、プラグイン(サードパーティ)をサポートすることであるため。新しいそれはあなたが正しいクラスのインスタンスを取得することができ、コードにすることはできませんが、反射によって反射させることができ、ダイナミックローダアセンブリとそのクラスを読み出し、その後、チェックマークして、オブジェクトをインスタンス化します。
- 符号化では位相が、今回は)新しいクラス名(ハードコーディング方法はありませんクラス名を読み取るために、構成ファイルから実行するために、クラスの名前を知らないと、オブジェクトを作成するためにリフレクションを使用する必要があります。目的は、未知の反射を拡大することですアプリケーション。たとえば、これらのDLLインターフェイスがこのプログラムにプラグインの中に挿入することができる実装するインターフェースの数を定義するプログラムを書きます。それでは、どのようにそれを達成するには?これは、反射することによって達成することができます。DLLがメモリにロードされ、その後、反射により、DLLのメソッドを呼び出します。多くの工場モデルは、反射の使用です。
自分のビジネスを開発するプログラマは、できるだけ離れて反射からすべき
リフレクション:など春や休止状態などの人気のライブラリでは、自然にその場所を反映しています。しかし、イントロスペクションビジネスの多くの例のコードではない良いことは、多くの理由のために、一般的に、私はいつもあなたがリフレクションを使用していないことを示唆しています。
最初は、コードの可読性とツールのサポートです。Javaコードを見つけるために、使い慣れたIDE、内部の依存関係を開いて、それは簡単です。さて、あなたのコードに置き換えた後、もう一度試して、その結果にリフレクションを使用していますか?カプセル化されたオブジェクトの状態を反映することによって変更した場合、その結果は制御不能になるであろう。サンプルコードを見てください、次のとおりです。
1つの パブリック クラス秘密{ 2 プライベート文字列の秘密。 3 公共の秘密(文字列秘密){ 4 本 .secrecy = 秘密。 5 } 6 パブリックストリングgetSecrecy(){ 7 戻り ヌル。 8 } 9 }
1つの インポートをjava.lang.reflect.Field。 2 3 パブリック クラスTetsSecrecy { 4 パブリック 静的 ボイドメイン(文字列[]引数)がスロー{例外 5 秘密S = 新シークレット( "TOP SECRET" )。 6 フィールドF =シークレット。クラス .getDeclaredField( "秘密" ); 7 f.setAccessible(真)。 8 のSystem.out.println(f.get(S))。 9 } 10 }
その場合、あなたは、セキュリティの保証がコンパイル時に取得することはできません。上記の例のように、あなたは、パラメータ入力getDeclaredField()メソッドの呼び出しが間違っている場合は、実行時にのみ発見することがわかります。ランタイムバグバグを見つけることは困難です知ることは、コンパイル時間よりもはるかにです。
最後に、価格の問題について話をします。反射の度合いを最適化するために、JITは異なり、いくつかの最適化時間が長くなります、といくつかのも、最適化を適用することはできません。そのため、パフォーマンスの損失は、時には数桁を反射差に到達することができます。しかし、一般的なビジネスアプリケーションでは、おそらく価格を気付くことはありません。
要約すると、私はAOPを使用して唯一の合理的なビジネスコード(直接の)反射シーンを考えます。また、あなたは、より良い、この反射特性から離れて。
性能解析
反射のメカニズムは、自己分析をプログラムする能力です。クラス変数、クラス、コンストラクタ、メソッド、修飾子を得るために。
利点:リフレクションを使用して操作の種類、動的クラスローディング、ダイナミックプロキシーの決意。
短所:パフォーマンスが問題である、一連の操作と同等のものを反映して、はるかに遅いJavaコードの直接のパフォーマンスよりも行うには、JVMの事を通知し説明しました。