まず、エージェントとは何かを紹介します。
(学習ビデオ共有: java ビデオ チュートリアル)
プロキシは設計パターンであり、その中心的な考え方は、ターゲットへのアクセスをプロキシ オブジェクトに転送することです。この利点は、コードを変更せずに、ターゲット オブジェクトがプロキシ オブジェクトを通じていくつかの追加機能を追加できることです。これは、元のコードを変更せずに、エージェントを通じていくつかの拡張機能を追加するプログラミングのアイデアです。
プロキシの処理は図の通りで、ユーザーはプロキシオブジェクトにアクセスし、プロキシオブジェクトはターゲットオブジェクトにアクセスすることでユーザーがターゲットオブジェクトにアクセスするという目的を達成します。
##プロキシ パターンには、次の 3 つの役割が含まれています。
public interface IBlogService { void writeBlog(); }ターゲット オブジェクトはターゲット インターフェイスを実装し、コードは次のとおりです:
public class BlogService implements IBlogService { @Override public void writeBlog() { System.out.println("i'm writing..."); } }コンストラクター メソッドを使用した静的プロキシ オブジェクト ターゲット オブジェクトが取得され、ターゲット インターフェイスが実装されます。ターゲット オブジェクトのメソッドは、ターゲット インターフェイスのメソッドで呼び出されます。コードは次のとおりです:
public class BlogStaticProxy implements IBlogService{ private IBlogService blogService; public BlogStaticProxy(IBlogService blogService) { this.blogService = blogService; } @Override public void writeBlog() { System.out.println("start writing..."); blogService.writeBlog(); System.out.println("end writing..."); } }Staticプロキシ オブジェクトの場合、構築メソッドを通じてターゲット オブジェクトが取得され、目的が達成されます。インターフェイスの場合、ターゲット インターフェイスのメソッドでターゲット オブジェクトのメソッドが呼び出されます。コードは次のとおりです:
public class BlogStaticProxy implements IBlogService{ private IBlogService blogService; public BlogStaticProxy(IBlogService blogService) { this.blogService = blogService; } @Override public void writeBlog() { System.out.println("start writing..."); blogService.writeBlog(); System.out.println("end writing..."); } }Test :
public class TestStaticProxy { public static void main(String[] args) { IBlogService target = new BlogService(); BlogStaticProxy proxy = new BlogStaticProxy(target); proxy.write(); } }
start writing… i’m writing… end writing…静的プロキシ、ターゲット オブジェクトを変更せずに、追加の拡張機能を作成してプロキシ オブジェクトを渡すことができます。ただし、静的メソッドは柔軟性が低いため、ターゲット インターフェイスのコードを変更すると、ターゲット オブジェクトとプロキシ オブジェクトの両方を変更する必要があります。 動的プロキシは、この状況をある程度回避します。動的プロキシは、ターゲット インターフェイスを実装するためにプロキシ オブジェクトを必要とせず、Java 仮想マシンのメモリにプロキシ オブジェクトを動的に生成します。 Jdk 動的オブジェクト Jdk の動的プロキシは、次の 3 つのパラメータを持つ Proxy クラスによって生成されます。 ClassLoader ローダー: クラス ローダーを使用する現在のターゲット オブジェクトと、その取得方法を指定します。ローダーは修正されていますClass>[] インターフェイス、: ターゲット オブジェクトによって実装されるインターフェイスのタイプ。ジェネリックを使用してタイプを確認します。 InvocationHandler h: イベント処理になります。ターゲット オブジェクトのメソッドが実行されるとトリガーされます。イベント ハンドラーのメソッドは、現在の実行ターゲット オブジェクトのメソッドをパラメータとして
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { }に渡します。Jdk の動的プロキシ コードは次のとおりです。
public class JdkBlogProxyFactory { private Object target; public JdkBlogProxyFactory(Object target) { this.target = target; } public Object newInstance() { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), (proxy, method, args) -> { System.out.println("start writing"); Object o = method.invoke(target, args); System.out.println("end writing"); return o; }); } }
テスト クラス:
public class TestJdkProxy { public static void main(String[] args) { IBlogService target = new BlogService(); System.out.println(target.getClass()); // 给目标对象,创建代理对象 IBlogService proxy = (IBlogService) new JdkBlogProxyFactory(target).newInstance(); // class $Proxy0 内存中动态生成的代理对象 System.out.println(proxy.getClass()); // 执行方法 【代理对象】 proxy.writeBlog(); } }
Control 台湾の印刷物は次のとおりです:
class com.forezp.proxy.BlogService class com.sun.proxy.$Proxy0 start writing i'm writing... end writing
CGLib ダイナミック プロキシ
CGLib は、非常に低レベルのバイトコード テクノロジを使用します。バイトコード テクノロジを通じてクラスのサブクラスを作成し、それをサブクラスで使用することです。メソッド インターセプト テクノロジは、親クラスのメソッドへのすべての呼び出しをインターセプトし、それに応じて横断的なロジックを組み込むために使用されます。
CglibBlogFactory プロキシ ファクトリ クラスは次のとおりです:
public class CglibBlogFactory implements MethodInterceptor { private Object target; public CglibBlogFactory(Object target) { this.target = target; } //给目标对象创建一个代理对象 public Object getProxyInstance() { //1.工具类 Enhancer en = new Enhancer(); //2.设置父类 en.setSuperclass(target.getClass()); //3.设置回调函数 en.setCallback(this); //4.创建子类(代理对象) return en.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("start writing..."); //执行目标对象的方法 Object returnValue = method.invoke(target, objects); System.out.println("end writing..."); return returnValue; } }
テスト クラス:
public class TestCglib { public static void main(String[] args) { IBlogService target = new BlogService(); //代理对象 IBlogService proxy = (IBlogService) new CglibBlogFactory(target).getProxyInstance(); //执行代理对象的方法 proxy.writeBlog(); } }
プログラムの実行、コンソール出力:
start writing... i'm writing... end writing...
関連する推奨事項:
java 入門チュートリアル以上がJavaプロキシモードの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

ホットトピック









