この記事では、Javaダイナミックエージェントの知識ポイントを整理しています。特定のコンテンツは次のとおりです。
1。Javaダイナミックプロキシ(比較公式声明)
プロキシモデルは、一般的に使用されるJava設計モデルです。その特徴は、プロキシクラスとデリゲートクラスが同じインターフェイスを持っていることです。プロキシクラスは、主にメッセージの前処理、メッセージのフィルタリング、デリゲートクラスへのメッセージの転送、およびイベント後のメッセージの処理を担当します。 通常、プロキシクラスとデリゲートクラスの間には関連性があります。プロキシクラスのオブジェクトは、デリゲートクラスのオブジェクトに関連付けられています。プロキシクラス自体のオブジェクトは、本当にサービスを実装するのではなく、代表クラスオブジェクトの関連する方法を呼び出すことで特定のサービスを提供します。
エージェントの作成期間によると、エージェントクラスは2つのタイプに分けることができます。
静的プロキシ:プログラマーによって作成されるか、特定のツールによってソースコードを自動的に生成してコンパイルします。プログラムが実行される前に、プロキシクラスの.classファイルは既に存在します。
動的プロキシ:プログラムが実行されているときに反射メカニズムを使用して動的に作成されます。
2。動的プロキシ実装
java.lang.reflect.proxy、
プロキシは、動的プロキシクラスとインスタンスを作成するための静的な方法を提供します。
newProxyInstance()
指定されたコールハンドラーにメソッド呼び出しを割り当てることができる指定されたインターフェイスのプロキシクラスのインスタンスを返します。
2.1。 DAOインターフェイス(シミュレートされたデータアクセスレイヤーインターフェイスを提供)
パッケージjavaproxy;/**データアクセスレイヤーインターフェイスを定義*/publicインターフェイスdao {// public void save();}を保存するデータシミュレーション2.2。 DAOIMPLクラス実装クラス
パッケージJavaproxy;パブリッククラスDAOIMPLはdao {@Override public void save(){system.out.println( "save a saveメソッド................"); }} 2.3。エージェント処理クラス
パッケージJavaproxy; Import java.lang.Reflect.InvocationHandler; Import Java.lang.Reflect.Method;パブリッククラスのdaohandlerを実装している招きハンドラー{private object obj; public daohandler(object obj){this.obj = obj;} @override public object(オブジェクトプロキシ、メソッドメソッド、オブジェクト[] args)スロー可能{system.out.println( "before before method"); args); system.out.println( "メソッド後に何かを行う"); }} 2.4。クライアントコール
パッケージJavaproxy; java.lang.reflt.proxyをインポートします。 public class client {public static void main(string [] args){// metaobject(proxed object)daoimpl daoimpl = new daoimpl(); //ビジネスプロキシクラスDaohandler daohandler = new daohandler(daoimpl); dao dao =(dao)proxy.newproxyinstance(daoimpl .getclass()。getClassLoader()、daoimpl.getClass().getInterfaces()、daohandler); dao.save(); }}2。5。結果
3. MyBatisでのプロキシ実装をシミュレートします
3.1。 MapperProxyクラス
javaproxyをパッケージ; java.lang.refllect.invocationhandler; import java.lang.refllect.method; import java.lang.refllect.proxy; public class mapperproxyは、Invocationhandler {@suppresswarnings( "Uncheded") /** @suppresswarnings( "Unchecked")を実装するsuppresswarnings( " * @param:sqlsessionを使用してメソッドを実行 * * @return:プロキシオブジェクトを返します */ public static <t> t newmapperproxy(class <t> mapperinterface、object sqlsession){classloader classloader = mapperinterface.getClassLoader(); class <? MapperProxy Proxy = new MapperProxy(); return(t)proxy.newproxyinstance(classloader、interfaces、proxy); } / * *(nonjavadoc) * * @see java.lang.refllect.invocationhandler#invoke(java.lang.object、 * java.lang.lang.reflt.method、java.lang.object []) * * * * * @param:@param:@param:methods offerm:methods offer the methods offer the methods offer the method of the incling cusp of the pappam * *対応するパラメーターマップを見つけます** @return:実行されたパラメーターオブジェクトを返します*/ publicオブジェクトInvoke(オブジェクトプロキシ、メソッドメソッド、オブジェクト[] arg)スロー可能{//ここで、対応する操作は、メソッド名とパラメーターSystem.out.out.println( "実際のメソッドを実行する) nullを返します。 }} 3.2。クライアント
パッケージJavaproxy; java.lang.reflt.proxyをインポートします。 public class client {public static void main(string [] args){dao dao = mapperproxy.newmapperproxy(dao.class、null); dao.save(); }}3.3。結果
上記は、JDKダイナミックプロキシを使用する例です。誰もがJavaプログラミングを学ぶことが役立つことを願っています。