プロキシモードは、プロキシオブジェクトを使用してユーザーの要求を完了し、ユーザーの実際のオブジェクトへのアクセスをブロックします。
プロキシモードには、セキュリティ上の理由など、多くの用途があります。クライアントが実際のオブジェクトに直接アクセスするのをブロックする必要があります。または、リモートコールでは、プロキシオブジェクトを使用して、リモートメソッドの技術的な詳細を処理する必要があります。または、システムを改善するために、実際のオブジェクトがカプセル化され、遅延荷重の目的を達成します。
システムが起動すると、プロキシモードを使用してほとんどのリソースを消費する方法を分離すると、システムの起動速度を高速化し、ユーザーの待ち時間を短縮できます。ユーザーが実際にクエリを実行している場合、プロキシクラスは実際のクラスをロードしてユーザーリクエストを完了します。これは、プロキシモードを使用して怠zyなロードを実現する目的です。
1。静的プロキシ実装:
トピックインターフェイス:
public interface idbquery {string request(); }本当のトピック:
パブリッククラスDBQueryはidbquery {public dbquery(){try {thread.sleep(10000); } catch(Exception e){e.printstacktrace(); }} public string request(){return "string request"; }}プロキシクラス:
パブリッククラスidbqueryproxyはidbquery {private dbquery dbquery; public string request(){if(dbquery == null)dbquery = new dbquery(); dbquery.request()を返します。 }}最後に、主な関数:
public class proxytext {public static void main(string [] args){idbquery dbquery = new idbqueryproxy(); system.out.println(dbquery.request()); }}静的プロキシプロキシクラスは、実際のクラスを実装するための一般的なインターフェイスであり、プロキシクラスは実際のクラスオブジェクトを指し、プロキシクラスメソッドに時間のかかる操作を実装することに注意してください。
動的プロキシ:
動的プロキシは、実行するときに、プロキシクラスを動的に生成します。つまり、プロキシクラスのバイトコードが生成され、実行時にロードされます。静的エージェントと比較して、動的エージェントは、実際の目的のために完全に同一のカプセル化クラスをカプセル化するように注意する必要はありません。多くのトピックインターフェイスがある場合、各インターフェイスのプロキシメソッドを作成するのは面倒です。インターフェイスが変更された場合、実際のクラスとプロキシクラスの両方を変更する必要がありますが、これはシステムメンテナンスを助長しません。第二に、一部の動的エージェントの生成方法は、指定されたプロキシクラス実行ロジックである実行時に実行することもできます。これにより、システムの柔軟性が大幅に向上します。
トピックインターフェイス:
public interface idbquery {string request(); } JDKプロキシクラス:
パブリッククラスjdbdbqueryhandlerを実装するrivocationhandler {idbquery idbquery = null; @OverrideパブリックオブジェクトInvoke(Object Proxy、Method Method、Object args)Throws Throwable {if(idbquery == null){idbquery = new dbquery(); } return idbquery.request(); } public static idbquery createjdbproxy(){idbquery jdkproxy =(idbquery)proxy.newproxyinstance(classloader.getsystemClassloader()、new class [] {idbquery.class}、new jdbqueryhandler(); system.out.println( "jdbdbqueryhandler.createjdbproxy()"); jdkproxyを返します。 }}主な関数:
public class proxytext {public static void main(string [] args){idbquery idbquery = jdbdbqueryhandler.createjdbproxy(); system.out.println(idbquery.request()); }}さらに、JDKダイナミックプロキシに類似してCGLIBおよびJavaSSISTダイナミックプロキシを使用することもできますが、JDKダイナミッククラスの作成プロセスは最速です。なぜなら、組み込みのdifineclass()メソッドはネイティブの実装として定義されているため、そのパフォーマンスは他よりも優れています。プロキシクラスの関数呼び出しでは、JDKのダイナミックプロキシはCGLIBおよびJavassist Dynamic Proxyほど良くありませんが、Javassist Dynamic Proxyはパフォーマンス品質が最悪であり、JDKの実装よりもさらに悪いです。実際の開発アプリケーションでは、プロキシクラスのメソッド呼び出し頻度は、プロキシクラスの実際の生成周波数よりもはるかに高くなるため、動的プロキシのパフォーマンスを呼び出すメソッドはパフォーマンスの焦点になります。 JDKダイナミックプロキシは、プロキシクラスと実際のトピックが統一されたインターフェイスを実装しており、CGLIBとJavassistのダイナミックプロキシにはそのような要件がないことを義務付けています。
Javaでは、動的プロキシの実装にはクラスローダーの使用が含まれます。 CGLIBを例にとると、動的クラスの読み込みプロセスの簡単な説明が説明されています。 CGLIBを使用して動的プロキシを生成すると、最初にエンハンサークラスのインスタンスを生成し、プロキシビジネスを処理するためのコールバッククラスを策定する必要があります。 Enhancer.create()メソッドでは、プロキシクラスのバイトコードは、defaultgeneratorstrategy.generate()メソッドを使用して生成され、バイト配列に保存されます。次に、Reflectutils.DefineClass()メソッドを呼び出し、Reflectionを介してClassLoader.DefineClass()メソッドを呼び出して、ByteCodeをクラスローダーにロードしてクラスの読み込みを完了します。最後に、Reflectutils.NewInstance()メソッドを介して、反射によって動的クラスインスタンスが生成され、インスタンスが返されます。その他はプロセスの詳細とは異なりますが、生成ロジックは同じです。
上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。