AOPに関しては、このことはあまりにも強力であるため、間違いなく春を考えるでしょう。しかし、AOPはプログラミングのアイデアであり、SpringはAOPの実装にすぎないことを明確にする必要があります。
まず、Baidu:
ソフトウェア業界では、AOPはアスペクト指向プログラミングの略語です。つまり、ランタイム中の事前コンパイル方法と動的エージェントを通じてプログラム機能の統一されたメンテナンスを実装するテクノロジーです。 AOPは、OOPの継続であり、ソフトウェア開発のホットトピック、Springフレームワークの重要な部分、および機能プログラミングの派生パラダイムです。ビジネスロジックのさまざまな部分をAOPを使用して分離することができ、それにより、ビジネスロジックのさまざまな部分間の結合を減らし、プログラムの再利用性を改善し、開発の効率を改善することができます。
今日は、Javaネイティブプロキシを使用して、簡単なAOP関数を実装しましょう。
まず、基本的な反射知識を知る必要があります。そうしないと、混乱していると感じるかもしれません。
これ以上の言葉はありません。タイピングを開始してください
まず、シンプルなインターフェイスを書きましょう。名前はAnimalInterfaceで、動物を調節するためのいくつかの基本的な方法を宣言するために使用されます。
これらの方法には、名前の設定、名前、通話、属性の取得(教育を受けていないことを許してください。実際、それが陸生であろうと水生であるか、水陸両用であるかを取得することです)
パッケージproxy.imp; public interface AnimalInterface {//名前void setName(string name); // name string getname();を取得します。 // void saks()を呼び出す(); //永続的なvoid getProperty();}を取得します次に、このインターフェイスを実装し、Xiao Heiという名前の犬を作成します
パッケージproxy; import proxy.imp.animalinterface; public class dogimpを実装する動物インターフェイス{private string name = "xiaohei"; public dogimp(){} @override public void setname(string name){this.name = name; } @Override public String getName(){return this.name; } @Override public void saks(){system.out.println( "子犬:ウールウール......"); } @Override public void getProperty(){system.out.println( "子犬は陸の動物ですが、泳ぐことができる"); }}誰もがAOPのような機能を実現するために焦りを抱かなければなりません...
まず、aophandleというクラスを作成して、InvocationHandlerインターフェイスを実装します。プロキシオブジェクトのインターフェイスはオブジェクトとは異なるため、プロキシを反射パラメーターとして使用できない場合、このプロキシメカニズムはクラス指向ではなくインターフェイス指向です。プロキシを使用すると、無限の再帰が発生します。その後、スタックオーバーフローがありますが、1回正常に反映できます。これは、プロキシオブジェクトとオブジェクトのプロキシが異なることを示しています。ただし、プロキシパラメーターのproxy.getClass()を介してクラスオブジェクトを取得し、プロキシクラスのメソッドとパラメーターを取得できます。これは、注釈注入、特定の方法注入、および属性注入のための実装方法も提供します。これについては後で話しましょう。
パッケージプロキシ; Import java.lang.reflt.invocationHandler; Import java.lang.reflect.method; public class aophandleを実装するrivocationhandler {//オブジェクトプライベートオブジェクトoを保存します。 public aophandle(object o){this.o = o; } /***このメソッドは自動的に呼び出されます。Javaダイナミックプロキシメカニズム*は、次のパラメーターに渡されます* @paramオブジェクトプロキシプロキシオブジェクトのインターフェイス* @paramメソッドとは異なります。このプロキシメカニズムはインターフェイス指向であり、クラス指向ではなく**/@OverrideパブリックオブジェクトInvoke(Object Proxy、Method Method、Object [] args)スロー可能{// return値オブジェクトret = null; //メソッド名name system.err.println( "実行方法:"+method.getName()+"nパラメータータイプ:"); //(クラスタイプ:method.getParametertypes())system.err.println(type.getname())のprantパラメーターを印刷します。 // return type system.err.println( "returnデータ型:"+method.getReturnType()。getName()); //反射コールメソッドret = method.invoke(o、args); // end system.err.println( "メソッド実行終了")を宣言します。 //反射コールメソッドリターンRETの返品値を返します。 }}ダイナミックプロキシが完了しました...そして私たちの動物工事...そして続けましょう
パッケージプロキシ; Import java.lang.reflect.proxy; public class animalfactory { /**** get object method* @param obj* @return* /private static object getanimalbase(Object obj){// proxy return proxy.newproxyinstance(obj.getclass() obj.getClass()。getInterfaces()、new aophandle(obj)); } / **** get object method* @param obj* @return* / @suppresswarnings( "un -checked")public static t getAnimal(object obj){return(t)getanimalbase(obj); } / **** get object method* @param classname* @return* / @suppresswarnings( "unchecked")public static t getanimal(string classname){object obj = null; try {obj = getanimalbase(class.forname(classname).newinstance()); } catch(Exception e){e.printstacktrace(); } return(t)obj; } / **** get object method* @param clz* @return* / @suppresswarnings( "unchecked")public static t getanimal(class clz){object obj = null; try {obj = getanimalbase(clz.newinstance()); } catch(Exception e){e.printstacktrace(); } return(t)obj; }}最後にそれは終わりです...何が欠けていますか?効果を見るためにここに来てください...
ハハ...ウェイター、私はサーブします...ああ〜いいえ、それはテストカテゴリです...ハハ///
パッケージproxy; Import org.junit.test; Import org.junit.runner.runwith; Import org.junit.runners.blockjunit4classrunner; Import proxy.animalactory; Import.imp.imp.animalinterface; @runwith(blockjunit4classrunner.classrunner.classner.classner.classner.classrunwith(blockjunit4clunwith) test1(){AnimalInterface dog = AnimalFactory.getanimal(dogimp.class); dog.say(); System.out.println( "私の名前は"+dog.getName()); dog.setname( "ergouzi"); System.out.println( "私の名前は"+dog.getName()); }}何?最終的に、これは役に立つのは、これがトリックではないのですか?このことをキャプチャするだけで、何が用途ですか...
どのようなAOP、AOPを見ないのですか、カスタムメソッドを入力するにはどうすればよいですか?ただのシソの入力、そしてこれに聴衆をだます?…。
さて、先に進んで、注入されたカスタムメソッドを実装する方法を見てみましょう...
まず、インターフェイスを追加し、AOPインジェクションインターフェイスと呼びましょう。 apmethodに名前を付けてください
メソッドの後と前に作成し、オブジェクトプロキシ、メソッドメソッド、オブジェクト[] argsパラメーターを受信します
これはより多くのことを行います...たとえば、メソッドを実行する前に、クラスのステータスを記録し、ログを書きます。 XX変数を監視します,,,
あなたの脳を開きます。
パッケージproxy.imp; import java.lang.Leflect.Method; public interface aopmethod {//インスタンスメソッドが実行される前に実行されるメソッド(オブジェクトプロキシ、メソッドメソッド、オブジェクト[] args); //インスタンスメソッドがvoidの前に実行された後に実行されるメソッド(オブジェクトプロキシ、メソッドメソッド、オブジェクト[] args);}次に、aophandleクラスを変更し、aopmethodプロパティを追加します。
Constructorメソッドを変更して、クラス初期化時にAOPMETHODインスタンスを取得します。
最後に、Invokeメソッドを変更します....コードに直接移動します
パッケージプロキシ; Import java.lang.reft.invocationHandler; Import java.lang.reflect.method; import proxy.imp.aopmethod; public class aopmethleはrifcocationhandlerを実装します{//オブジェクトをプライベートAopmethodメソッドの保存;プライベートオブジェクトo; public aophandle(Object o、aopmethod method){this.o = o; this.method = method; } /***このメソッドは自動的に呼ばれます、Javaダイナミックプロキシメカニズム*次のパラメーターは* @paramオブジェクトプロキシに渡されます。プロキシオブジェクトのインターフェイスは、オブジェクトと呼ばれる@paramオブジェクトと呼ばれる@paramメソッド[] @paramオブジェクト[] argsメソッドパラメーター*は、プロキシオブジェクトが使用されている場合に使用される場合に使用できない場合に使用できない場合、@paramオブジェクト[] argsメソッドパラメーター*インターフェイス指向であり、クラス指向ではなく**/ @OverrideパブリックオブジェクトInvoke(Object Proxy、Method Method、Object [] args)スロー可能{Object Ret = null; //修正場所はここにあります。 ret = method.invoke(o、args); //修正場所はここにあります。返品; }} huhu、タスクは完了しました、それはすべてが問題であるようです、かわいい...
今すぐテストクラスを更新してください...
パッケージプロキシ; java.lang.reflect.method; import org.junit.runwith; import org.junit.runners.blockjunit4classrunner; Import proxy.imp.apmethod; import proxy.imp.imp.animalinterface; @runwith(blockjunit4clistrunner.clussnner. static void main(string [] args){animalinterface dog = animalfactory.getanimal(dogimp.class、new aopmethod(){//ここでは、メソッド実行前のパブリックボイドの前にaopカットメソッドです(オブジェクトプロキシ、メソッドメソッド、オブジェクト[] args){system.err.er.println( " + method.getname in" AOPカットメソッドメソッド実行後(オブジェクトプロキシ、メソッドメソッド、オブジェクト[] args){system.err.println( " + method.getName() +"メソッド実行後 "); dog.say();文字列name1 = "私の名前は" + dog.getName(); System.out.println(name1); dog.setname( "ergouzi");文字列name2 = "私の名前は"+dog.getName(); System.out.println(name2); }} huhu、親愛なる、あなたは注入したいですか?あなたはあなた自身の方法をそれにカットしたように感じますか?ハハ…
すべてが完璧だと思われますが、私はいつも何かが欠けていると感じていますか?ああ、はい、Springのような構成ファイルが不足しています。
実際、それらはすでに非常に単純です。それらをあなたに任せましょう。 XML形式を設計して待ってください、あなたは何と言いますか?カスタムメソッドを傍受することはできませんか?
春のようなカスタムメソッドを傍受することはできませんか? OH ~~いいえ、実際、メソッドとMethodNameを使用して、Method(Object Proxy、Method Method、] Args)を使用してメソッドを使用してMethodNameを提供することを判断することができます。
もちろん、この例には実用的な意味がなく、さまざまな完全なAOPフレームワークと比較することはできません。この記事はあなたに思考の方法を提供するだけですが、あなたは物事がどんなに素晴らしいものであっても、それらは少しずつ蓄積されていることを覚えておく必要があります
ダウンロードの例:http://xiazai.vevb.com/201701/yuanma/javaaop_jb51.rar
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。