Wenn es um AOP geht, werden Sie definitiv an den Frühling denken, weil dieses Ding zu mächtig ist. Sie müssen jedoch klar sein, dass AOP eine Programmidee ist und der Frühling nur eine Implementierung von AOP ist.
Erstens Baidu:
In der Softwareindustrie ist AOP die Abkürzung der Aspekt -orientierten Programmierung, dh eine Technologie, die eine einheitliche Wartung von Programmfunktionen durch Vorkompilierungsmethoden und dynamische Agenten während der Laufzeit implementiert. AOP ist eine Fortsetzung von OOP, ein heißes Thema in der Softwareentwicklung, ein wichtiger Bestandteil des Spring -Frameworks und ein Derivatparadigma der funktionalen Programmierung. Die verschiedenen Teile der Geschäftslogik können durch Verwendung von AOP isoliert werden, wodurch die Kopplung zwischen den verschiedenen Teilen der Geschäftslogik, die Wiederverwendbarkeit des Programms verbessert und die Effizienz der Entwicklung verbessert wird.
Lassen Sie uns heute Java Native Proxy verwenden, um einfache AOP -Funktionen zu implementieren.
Zunächst müssen Sie grundlegende Reflexionswissen kennen, sonst können Sie sich verwirrt fühlen.
Keine Wörter mehr, fangen Sie einfach an, tippen zu tippen
Lassen Sie uns zunächst eine einfache Schnittstelle schreiben. Der Name ist AnimalInterface, mit dem einige grundlegende Methoden zur Regulierung von Tieren deklariert werden.
Zu diesen Methoden gehören das Festlegen von Namen, das Erhalten von Namen, Berufungen und Attributen (verzeihen Sie mir, dass sie nicht ausgebildet wurden. Tatsächlich ist es zu erhalten, ob es terrestrisch oder aquatisch oder amphibisch ist).
Paket proxy.imp; public interface AnimalInterface {// Setzen Sie den Namen void setName (String -Name); // die Name Zeichenfolge GetName () abrufen; // void sagt (); // Die permanente Leere getSProperty ();} erhalten;}Dann implementieren wir diese Schnittstelle und erstellen einen Hund namens Xiao Hei
Paketproxy; Proxy importieren. public dogimp () {} @Override public void setName (String name) {this.name = name; } @Override public String getName () {return this.name; } @Override public void sagt () {System.out.println ("Welpe: Wolle Wolle ......"); } @Override public void getProperty () {System.out.println ("Welpe ist ein Landtier, kann aber schwimmen"); }} Jeder muss ungeduldig sein, um AOP-ähnliche Funktionen zu erkennen ...
Erstellen wir zunächst eine Klasse namens Aophandle, um die InvocationHandler -Schnittstelle zu implementieren. Wenn Sie Invoke, Proxy als Reflexionsparameter, nicht verwenden können, da sich die Schnittstelle des Proxy-Objekts von einem Objekt unterscheidet, ist dieser Proxy-Mechanismus eher interface-orientiert als klassenorientiert. Wenn Sie Proxy verwenden, verursacht dies eine unendliche Rekursion. Dann gibt es einen Stapelüberlauf, aber es kann immer noch einmal erfolgreich reflektieren. Dies zeigt, dass das Proxy -Objekt und der Proxy des Objekts unterschiedlich sind. Wir können das Klassenobjekt jedoch über Proxy.getClass () des Proxy -Parameters erhalten und dann die Methoden und Parameter der Proxy -Klasse erhalten. Dies liefert auch eine Implementierungsmethode für die Annotationsinjektion, eine spezifische Methodeninjektion und eine Attributinjektion. Lassen Sie uns später darüber sprechen.
Paketproxy; importieren java.lang.reflect.invocationHandler; import java.lang.reflect.method; öffentliche Klasse Aophandle implementiert InvocationHandler {// Objekt privates Objekt o; public aophandle (Objekt o) {this.o = o; } /*** Diese Methode wird automatisch aufgerufen, Java -dynamischer Proxy -Mechanismus* wird im folgenden Parameter übergeben. Dieser Proxy-Mechanismus ist interface-orientiert, nicht klassenorientiert **/@Override Public Object Invoke (Object Proxy, Methode Methode, Object [] args) löst Throwable {// Methode Return Value Object Ret = NULL aus; // Methodenname system.err.println ("Ausführungsmethode:"+method.getName ()+"n Parametertyp ist:"); // Parameter Druck für (Klassentyp: method.getParameterTypes ()) System.err.println (type.getName ()); // Rückgabetyp system.err.println ("Datentyp zurückgeben:"+method.getReturnType (). GetName ()); // Reflexionsaufrufmethode ret = methode.invoke (o, args); // das End system.err.println deklarieren ("Methode Execution End"); // Rückgabe des Rückgabewerts der reflektierenden Call -Methode Return Ret; }}Der dynamische Proxy wurde abgeschlossen ... und dann unser Tierfaktor ... und lasst uns fortsetzen
Paketproxy; importieren Sie java.lang.reflect.proxy; public class AnimalFactory { /**** Objektmethode erhalten* @param obj* @return* /private statische Objekt GetAnimalbase (Object Obj) {// Proxy -Objektrückgabe -Proxy.newProxyinstance (OBJ.GetClass). obj.getClass (). getInterfaces (), New Aophandle (obj)); } / **** Objektmethode abrufen* @param obj* @return* / @Suppresswarnings ("Unbekämpft") public static t getArimal (Objekt obj) {return (t) getArimalbase (OBJ); } / **** Objektmethode abrufen* @param className* @return* / @SuppressWarnings ("Unbekämpft") public static t getArimal (String className) {Object obj = null; try {obj = getArimalbase (class.Forname (className) .Newinstance ()); } catch (Ausnahme e) {e.printstacktrace (); } return (t) obj; } / **** Objektmethode abrufen* @param clz* @return* / @Suppresswarnings ("Unbekämpft") public static t getanimal (Klasse clz) {Object obj = null; try {obj = getArimalbase (clz.newinstance ()); } catch (Ausnahme e) {e.printstacktrace (); } return (t) obj; }} Endlich ist es das Ende ... was fehlt? Komm her, um den Effekt zu sehen ...
Haha ... Kellner, ich werde dienen ... oh ~ nein, es ist eine Testkategorie ... haha ///
Paket proxy; import org.junit.test; import org.junit.runner.runwith; import org.junit.runners Test1 () {AnimalInterface Dog = AnimalFactory.GetArimal (Dogimp.Class); Dog.say (); System.out.println ("Mein Name ist"+hunde.getName ()); Dog.SetName ("Ergouzi"); System.out.println ("Mein Name ist"+hunde.getName ()); }} Was? Was ist das am Ende nützlich, ist das nicht ein Trick? Fangen Sie einfach dieses Ding fest, was nutzt ...
Was für AOP, warum sehe ich keine AOP, wie kann ich die benutzerdefinierte Methode eingeben? Nur ein Syso -Eingang und täuschen Sie das Publikum dazu?….
Ok, dann lass uns weitermachen und sehen, wie die injizierte benutzerdefinierte Methode implementiert wird ...
Fügen Sie zunächst eine Schnittstelle hinzu, nennen wir es AOP -Injektionsschnittstelle. Nennen Sie es Aopmethod
Nach und vor Methoden erstellen, Objektproxy, Methodenmethode, Objekt [] args Parameter empfangen
Dies wird mehr Dinge tun ... zum Beispiel, bevor die Methode ausgeführt wird, den Klassenstatus aufzeichnen und das Protokoll schreiben. Überwachen Sie die XX -Variable ,,,,
Öffne dein Gehirn.
Paket proxy.imp; importieren java.lang.reflect.Method; öffentliche Schnittstelle AOPMethod {// Methode, die vor der Instanzmethode ausgeführt wird, wird nach (Objektproxy, Methode Methode, Object [] args) für void ausgeführt. // Methode, die nach der Instanzmethode ausgeführt wird, wurde vor dem (Objektproxy, Methode Methode, Object [] args) für void ausgeführt;} Dann modifizieren Sie die Aophandle -Klasse und fügen Sie die AopMethod -Eigenschaft hinzu.
Ändern Sie die Konstruktormethode, um bei der Klasseninitialisierung eine AopMethod -Instanz zu erhalten.
Ändern Sie schließlich die Invoke -Methode .... Gehen Sie direkt zum Code
Paketproxy; importieren java.lang.reflect.invocationHandler; import java.lang.reflect.method; importieren proxy.imp.aopMethod; public class Aophandle implementiert InvocationHandler {// Objekt private aoPMethod -Methode; privates Objekt o; public aophandle (Objekt O, AOPMethod -Methode) {this.o = o; this.method = Methode; } /*** Diese Methode wird automatisch aufgerufen. Schnittstelle orientiert, nicht klassenorientiert **/ @Override Public Object Invoke (Objektproxy, Methode, Objekt [] args) löscht Throwable {Object Ret = NULL aus; // Der Modifikationsort ist hier. ret = method.invoke (o, args); // Der Modifikationsort ist hier. Rückkehr; }} Huhu, die Aufgabe ist erledigt, es scheint, dass alles ein Problem ist, süß ...
Aktualisieren Sie jetzt die Testklasse ...
Paket proxy; import Java.lang.reflect.method; import org.junit.runner.runwith; import org.junit.runners.blockjunit4Clasrunner; static void main (String [] args) {AnimalInterface Dog = AnimalFactory.getanimal (Dogimp.class, New AopMethod () {// Hier ist die AOP -Schneidemethode vor der Methode Ausführung öffentlicher Void vor (Objektprofile, Methode Methode, Objekt [] args) {system.r.println ("IM -Methods. AOP -Schneidmethode nach der Methode Ausführung öffentliche void nach (Objektproxy, Methode, Objekt [] args) {System.err.println ("Ich bin in" + method.getName () + "Ausführung nach Methodenausführung"); Dog.say (); String name1 = "Mein Name ist" + dog.getName (); System.out.println (Name1); Dog.SetName ("Ergouzi"); String name2 = "Mein Name ist"+dog.getName (); System.out.println (name2); }} Huhu, Liebes, hast du Lust auf die Injektion? Haben Sie das Gefühl, dass Sie Ihre eigene Methode in sie geschnitten haben? Haha…
Es scheint, dass alles perfekt ist, aber ich habe immer das Gefühl, dass etwas fehlt? Oh ja, es gibt einen Mangel an Konfigurationsdateien wie Spring.
In der Tat sind diese schon sehr einfach. Lassen Sie uns sie Ihnen überlassen. Entwerfen Sie einfach das XML -Format und warten Sie, was sagen Sie? Sie können benutzerdefinierte Methoden nicht abfangen?
Sie können benutzerdefinierte Methoden wie Spring nicht abfangen? OH ~~ Nein, Sie können die Methode und den Methode verwenden, um ein Urteil vor (Objektproxy, Methode, Object [] Args) zu fällen, um die Methode zu verwenden und MethodName zu geben.
Natürlich hat dieses Beispiel keine praktische Bedeutung und kann nicht mit verschiedenen perfekten AOP -Frameworks verglichen werden. Dieser Artikel bietet Ihnen nur eine Denkweise, aber Sie müssen sich daran erinnern, dass die Dinge, egal wie großartig die Dinge sind, Stück für Stück angesammelt werden
Beispiel Download: http://xiazai.vevb.com/201701/yuanma/javaaop_jb51.rar
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.