0. エージェント モード
なぜエージェント モードを学ぶ必要があるのでしょうか?これは SpringAOP の最下層です [SpringAOP と SpringMVC]
プロキシ モードの分類:
静的プロキシ
-
動的プロキシ
1.静的プロキシ
静的プロキシでは、ターゲット オブジェクトの各メソッドの拡張は手動で行われます (コードの詳細は後で説明します_)、非常に柔軟性が低く (たとえば、新しいメソッドをインターフェイスに追加すると、ターゲット オブジェクトとプロキシ オブジェクトを変更する必要があります)、面倒です (_それぞれに別個のプロキシ クラス を記述する必要があります)ターゲットクラス)。実際のアプリケーション シナリオは非常に少なく、日常の開発で静的プロキシが使用されるシナリオはほとんどありません。
#ロール分析:
- #抽象ロール: 一般に、問題を解決するにはインターフェイスまたは抽象クラスが使用されます
- # #実際の役割: 演じられた役割
- エージェントの役割: 実際の役割として行動し、実際の役割を果たした後、通常はいくつかの補助的な業務を行います
- 顧客: プロキシ オブジェクトにアクセスする人!
- コードステップ:
1. インターフェイス
public interface Rent { public void rent(); }2. 実際の文字
//房东 public class Host implements Rent { public void rent() { System.out.println("房东要租房子"); } }3.エージェント ロール
public class Proxy implements Rent{ private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } public void rent(){ seeHouse(); host.rent(); fare(); } //看房 public void seeHouse(){ System.out.println("中介带你看房"); } //收中介费 public void fare(){ System.out.println("中介收费"); } }4. エージェント ロールへのクライアント アクセス
public class Client { public static void main(String[] args) { Host host = new Host(); //代理,代理角色一般会有附属操作! Proxy proxy = new Proxy(host); proxy.rent(); } }
エージェント モードの利点:
本当の役割 操作はより純粋です!一部の公的な業務に注意を払う必要はありません。
- #一般の人々はエージェントの役割に任せられます。ビジネスの分業化を実現!
- 公共サービスが拡大するときは一元管理が便利!
- 欠点:
実際のロールはプロキシ ロールを生成します。JVM の観点から見ると、静的プロキシはインターフェイス、実装クラス、およびプロキシ クラスが実際のクラス ファイルになりました。
2. 基盤となるプロキシ モデルである AOP についての理解を深めます3. 動的プロキシ
動的プロキシの役割は静的プロキシの役割と同じです
- 動的プロキシのプロキシ クラスは動的に生成され、直接作成されるものではありません。
- 動的エージェントは、インターフェイス ベースの動的エージェントとクラス ベースの動的エージェントの 2 つのカテゴリに分類されます。
- インターフェイス ベース— —JDK 動的プロキシ
- クラスに基づく: cglib 動的プロキシ
- Java バイトコード実装: javasist
JVM の観点から見ると、動的プロキシは実行時にクラスのバイトコードを動的に生成し、JVM にロードします。 。
//Proxy是生成动态代理类,提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。 //InvocationHandler-- invoke 调用处理程序并返回接口, 是由代理实例的调用处理程序实现的接口 。動的プロキシの利点:
現実のキャラクターの操作をより純粋にすることができます。何らかの公的業務に対処する必要はありません
- 一般向けの業務はエージェントの役割に任せられます。実装
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h){ }
1.
loader : プロキシ オブジェクトをロードするために使用されるクラス ローダー。
2.
インターフェース : プロキシ クラスによって実装されるいくつかのインターフェース; 3.
h : InvocationHandler インターフェイスを実装するオブジェクト;
動的プロキシを実装するには、処理ロジックをカスタマイズするために
InvocationHandler
InvocationHandler インターフェイスを実装するクラスの
invoke メソッドに転送されます。
public interface InvocationHandler { Object invoke(Object proxy, Method method, Object[] args) throws Throwable; }
1.proxy: 動的に生成されたプロキシ クラス2.
method: プロキシ クラス オブジェクトによって呼び出されるメソッドに対応します3.
args: 現在のメソッドのパラメータmethod動的プロキシの例
1. インターフェイスを定義しますpublic interface Rent {
public void rent();
}
2. 実装しますレンタル インターフェイス public class Host implements Rent { @Override public void rent() { System.out.println("房东要租房"); } }3. JDK 動的プロキシ クラスを定義します
public class DebugInvocationHandler implements InvocationHandler { /** * 代理类中的真实对象 */ private final Object target; public DebugInvocationHandler(Object target){ this.target = target; } /** * 当你使用代理对象调用方法的时候实际会调用到这个方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //调用方法前 System.out.println("before method" + method.getName()); Object res = method.invoke(target, args); //调用方法后 System.out.println("after method" + method.getName()); return res; } }
invoke()
メソッド: 動的プロキシ オブジェクトがネイティブ メソッドを呼び出すと、実際に呼び出されます。取得したのはinvoke() メソッドで、その後
invoke() メソッドが代わりにプロキシ オブジェクトのネイティブ メソッドを呼び出します。
4. プロキシ オブジェクトのファクトリ クラスを取得する
public class JdkProxyFactory { public static Object getProxy(Object target){ return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new DebugInvocationHandler(target) ); } }
getProxy()
: 主にProxy.newProxyInstance を通じて特定のクラスのファクトリ クラスを取得します。 () メソッド プロキシ オブジェクト
5。実際の使用法
public static void main(String[] args) { //Rent rent = new Host(); //Rent rentProxy= (Rent) Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(),new DebugInvocationHandler(rent)); Rent rentProxy = (Rent)JdkProxyFactory.getProxy(new Host()); rentProxy.rent(); }
メソッドレント前の上記エージェント実行の出力
##家主は家を借りたいと考えています
メソッドレントの後に以上がJavaにおける動的プロキシと静的プロキシの解析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

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

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。
