インタビュアー:春AOPのご理解の話?プラス間違いなく、これらを追加してください!

01はじめに

我々はすべて知っているように、一度、AOPを述べ信じ、CGLIB JDKプロキシエージェントを考えて、はい、これら二つの薬剤は、我々はすべての反射神経を条件付けされている実行時のメモリに一時的に生成されたプロキシクラスを、そのためとも呼ばれるダイナミック-実行しているときに強化します演技ダイナミックな薬があるので、すべてのものは、絶対的なものではなく、そして、そこに考えられている:それは、静的プロキシの存在ではないのですか?

02 LTW(ロード時間のウィービング)

実際には、ランの外側部分に織り込まに加えて、我々はアスペクト製織を行う方法があり、それがあってもよいロードされたクラスのバイトコードを変換し、その後、ターゲット・エントリ・ポイント(ターゲットクラス)に織り込まれ、このアプローチでありますLTWは、すなわち、帯電防止剤は、(また、待機プロキシと呼ばれるコンパイル時に拡張、コード例では、後でそこに関連します)。

それが導入、および原理を理解したいたJava5でLTWは、一つは最初の知識--Instrumentパッケージを理解する必要があります。

03作品java.lang.instrumentパッケージ

このパッケージのJDK5.0の導入は、目的は、基礎となるJVMへのアクセスを設定することができることです。どのようにアクセスするには?実際には、かなり面倒に感じる個人的に言えば、JVMの起動パラメータによって必要とされる-javaagent参照の開始時にJVM内部コンポーネントを取得します。次のようにパラメータの形式は次のとおりです。

-javaagent:[=オプション]

ここでは、jarpathパラメータとオプションを説明するために急いで、関連する子を売るのサンプルコードを実行すると、後者の結果は赤いボックスラベルされた命令を、より良いの使用のためになります。

まあ、それは持っているとAOPとそれを行いますか?

それは嵌合機能がAOP JVMを開始実現するように、ClassTransformer、クラスバイトコード変換を適用しているからです。

パッケージの下に、次の約2の重要なインターフェース機器は言いました:

(1)ClassFileTransformer

これは、図示のように、そこに唯一の方法であると、そのクラスファイルコンバータインタフェースです。

image.png

注:値を返すメソッドを変換、バイト[]、バイトコードを変換表すが、リターンが空の場合、コード変換処理のない部分は、元のクラスの単語としてないないことを示すタイプセクションコード空。

(2)計測

このインタフェースは、多くの方法を提供し、私たちは主の方法、すなわちに注意を払う:その役割は内部JVMに登録されたいくつかのClassFileTransformer、図に示すインタフェースを置くことですaddTransformer方法:

image.png

このような特定の作品:

①ClassFileTransformerインスタンスがJVMに登録された後、JVMクラスロード時、それはClassFileTransformer最初の呼び出し()メソッドは、バイトコードを変換し、変換するファイル。

もっとClassFileTransformerインスタンスを登録した場合は②、呼び出しは登録順に行われます。

また、これはJVMバイトコードレベルからの傍受を達成するために、その後、あなたは自分自身、すなわち、AOP達成された効果を追加したい論理演算子に織り込ま。

04コードとデモの効果

あなたのJVMコンバータに登録されたAOPを実現する方法のデモンストレーションを与えるために、次のコードを使用し、ドライポイントするように、と述べました。読んで、容易にするために、私はコードや画像空間のコメントに書かれている重要な注意を参照してくださいに注意を払います。

(1)まず、アナログ機能に必要なカットのために独自の変換を実装します

image.png

なお、ここで再び、コードリターンヌルを強調し、バイトコードのクラスのブランキングをロードしません。

(2)第二に、我々は再びプロキシクラスを達成しました

image.png

それは動的プロキシではないので、なぜ、プロキシクラス内で達成すべきです。

(3)最後に、我々はプログラムのエントリに代わって、主な機能を書きます

image.png

これまでのところ、私たちのデモは、ランニングの結果を初めて目に行われます。

image.png

瓶ときに、ローカル05注意

私たちは、あなたが以下に示すように、直接図に示す注意し、具体的な手順を日食使用することができ、javaagent実行CMDパラメーターは、インターフェースmyTransformer.jarを指定した場合、このjarは、抜け出すために私たち自身の必要性である、スクリーンショットの結果を参照してください。

image.png

image.png

06要約

私たちは、実際には、このような薬剤の使用は、衝突JVMすべてのクラスを持っているかもしれませんがない動的プロキシ便利でも、スイッチがあり、ことがわかります、操作が更新するのは比較的面倒で、実際の生産展開に不便をたくさん存在します。

しかし、これらはAOP、AOPの事実についての詳細を知るために、あなたのより良いを与えるために書かれている、私たちは私たち自身、見つ​​かったことを学ぶために多くのものがある知っている、実際には、この点で春の「操作上の問題」にはまだやるべきことがたくさんあります物事、多くの場合、(気持ちが行って見て、それは傷つけることはありません詳細について何かを書くことができます長い、我々が興味を持っている大きなものであるため、ここでは、言っているわけではない)、いくつかのXML構成管理を提供しますjavaagent下のパラメータを設定する必要がありません。

最後のインタビューで述べたものならば、インタビュアーが余分なポイントがあるだろうと考えていることに言及。


おすすめ

転載: blog.51cto.com/14453419/2424469