JAVA動的プロキシあなたが本当に完全にJavaの動的プロキシ、それを理解できますか?(復刻版)

オンライントーク JAVA ダイナミック機関、特別にオーバー転載、誇大広告を述べ、理解しやすいで書かれた記事を見つけました

オリジナル住所ます。https://www.jianshu.com/p/95970b089360


  ダイナミックプロキシは、どのような条件で背の高いように見えるかもしれませんが、実際にはその複雑ではない、文字通りから直接理解することは簡単です。動的エージェント、あなたはそれが何を意味するのかを推測することができ、実行時に動的プロキシで何か、それが何かをするプロキシ。まず、この動的プロキシに本当の意味を理解していない、我々は最終的にそれの下で行われているかを理解するために鮮やかな例を与える必要があります。

プログラマの 開発者は、彼がコードを開発する、と彼はデバッグをデバッグします。プログラマを含む、分類の多くを持っている Javaプログラマ JavaDeveloper、彼はJavaコードがなるデバッグ、Javaコードを開発します。

www.wityx.com

しかし、その後、ザック・プログラマという男が祈る、その前に開発するので、彼はコードのバグを開発していません。

ザック、この「特殊能力」は、プログラマがこの機能を持っているものの練習のうち、取得、およびされていません。我々はまた、このような特性を持っているプログラマを定義しますが、手続きの混乱、何千のすべての特性を持つことができますが。ときに我々が定義し、それを漏洩しないと約束しているのだろうか?

実際には、我々は彼が第二の天性であるので、我々はこの成長プログラマにこの機能を実装する必要があるのではなく、彼が生まれた前に定義され、彼を定義する必要はありません。

私たちは、コードがどのように実装されるかを見てみましょう。

www.wityx.com

ザックは普通のJavaプログラマであれば、彼の開発をした結果であるので、
ザックJavaの符号化である
ザックは、Javaデバッグしています

しかし、(代理店の後に)実際のザック
のために祈るザックは、コードにある!
ザックは、Javaの符号化である
ザックのNOバグを持っていない持っています!デバッグする必要はありません!

たとえば、Proxy.newProxyInstance()

上記は、動的プロキシの使用であるかを振り返ります。オブジェクトのインスタンスを生成し、そのオブジェクト剤のこのインスタンスのプロキシnewInstanceメソッドは、プロキシオブジェクトを生成します。

www.wityx.com

非常に重要な人物が、また、それを理解するために少数の人々があります。なぜクラスローダを渡し、ザックザックそれをインターフェイス?
zackProxy種類Developerインタフェースではなく、実装クラスが気づいていません。生成された後のオブジェクトのザック・エージェントなので、インターフェース開発を実装する任意のクラスに属していません。しかし、それは開発者向けのインターフェイスに基づいており、クラスのロード・エージェントのうち、ザックされます。

「newProxyInstance()インタフェース定義を見て

www.wityx.com

 これらの三つのパラメータの特定の意味は、注釈が記述されているかを見て

www.wityx.com

  • loder、選択したクラスローダ。エージェントはザックなので、通常はザッククラスローダでロードされます。
  • インタフェースは、プロキシクラスは、複数であってもよいインタフェースを実装します。
  • H、メソッド結合剤クラス。

最後に、基本的なクラスを決定loderおよびインタフェースは、クラスの方法この種です。そして、時間があるのInvocationHandler、より多くの機能が何であるかを最終的にプロキシクラスを決定します。だから、内容は、この動的プロキシのInvocationHandlerの焦点です。

InvocationHandler

www.wityx.com

 

 

ノートが知られている記述するためによると、InvocationHandlerです効果は、プロキシオブジェクトの元のメソッドが呼び出されたときに、InvocationHandlerですコンテンツ内で定義されたメソッドを実行するためにバインドされるということであり、それは、元のメソッドの戻り値の結果に置き換えられます。

三つのパラメータのInvocationHandler

  • プロキシオブジェクトのプロキシ・インスタンス。
  • メソッド、オブジェクトメソッドと呼ばれます。
  • 引数、パラメータを呼び出します。

上記の例では、

www.wityx.com

 もしへの最後のreturn文

返す method.invokeを(プロキシ、agrs)。

ザックされていないオブジェクトを呼び出すが、プロキシは、上記の説明に従って何が起こるかを推測?
はい、それはサイクルコールを維持します。今度は内部のプロキシオブジェクトを呼び出すオブジェクトのメソッドが呼び出されるオブジェクトのプロキシクラスで、それはのInvocationHandlerをトリガするプロキシ、およびInvocationHandlerですので、サイクル呼び出しを停止しません。そして、対応するプロキシメソッドが実装されていません。彼らは、エラーのサイクルを停止することはありません

ダイナミックプロキシの原則

上記の説明を通じて、私たちは比較的強いダイナミックプロキシの使用を理解すると信じています。最終的にはそのダイナミックプロキシは、それを達成する方法である、我々はの重要な分野のソースを見ています。
newProxyInstanceでは()などの段落で発行しました。

www.wityx.com

実際には、おそらく、これらのインターフェースとクラスローダを経由して、インタフェースをコピーし、このプロキシクラスCLを取得します。次いで生殖プロキシクラスのコンストラクタ(クラスのクラスでこのコードgetConstructor0法)によって反射され得る、そして最終的に対象外の新しいコンストラクタによって同時にのInvocationHandlerこのオブジェクトをバインドします。

ダイナミックプロキシの使用シナリオ

ダイナミックプロキシの利点は、我々はそれがより柔軟性があり、それを事前に定義する必要がなく、実行時にクラスを変更する唯一の方法をカットすることができ、例から見ることができます。

私たちの筆跡に一般的にはあまり動的プロキシが、我々は実際には非常に多くを使用する必要があります。このようビーン@依存性の注入などのプロジェクトと春ノートは、Autowired @、@Transactional情勢などがAOP(セクションプログラミング)Srpingつまり、使用しているノート。

このシナリオの使用が最良の着地点動的プロキシである、我々はコードポイントに欲しいものにカットし、クラス、メソッド、中には非常に柔軟であることができ、動的プロキシの内容です。だから我々は最終的に春AOPの詳細な理解の下に来る次はどのように動的プロキシです。

おすすめ

転載: www.cnblogs.com/wuliaojava/p/11743714.html