Java Dynamic Proxy

Ersatzmodell

Verwandtes Ersatzmodell

** Proxy-Muster ** (Proxy-Muster) 23 Arten von wirtschaftlichem Entwurfsmodell Nr. 1, Java-ähnliches dynamisches Proxy-Modell. Ist es ein Modell für einen Ersatz für eine Krankenschwester? Vertreter der Unterseite Schematische UML-Grafiken: 2.png

Schematischer Teilnehmer:

Ersatzschema Beispielkind

Die Halsspitze fixierte einen repräsentativen "beweglichen" verkehrswerkzeugähnlichen Eingang:

public interface Moveable {
    /**
     *Bewegung spezifizierte Entfernung,Seit Kilometer
     * @param km mobile Entfernung
     */
    void move(Integer km);
}

Ungefähr die Methode der Absprache: Metro, die Methode des Trainings, die Methode des Bewegens und die Methode des Beobachtens.

public class Metro implements Moveable {
    @Override
    public void move(Integer km) {
        try {
            System.out.println("Metro is moving ...");
            Thread.sleep(km * 1000);  //Imitationsübertragungszeit
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Der Leistungsproxy: Leistungsproxy:

public class PerformanceProxy implements Moveable {
    private Moveable m;
    public PerformanceProxy(Moveable m) {
        this.m = m;
    }
    @Override
    public void move(Integer km) {
        long start = System.currentTimeMillis(); //Aufnahmemethode Startzeit für die Anpassung
        m.move(km);                              //Methodenanpassung
        long end = System.currentTimeMillis();   //Methode Kohäsionszeit
        System.out.println("Wenn getragen: " + (end - start)/1000.0); // 计算Wenn getragen
    }
}

Messersatzmodell:

public static void main(String[] args) {
    new PerformanceProxy(new Metro()).move(5);
}
----Experimentelle Ergebnisse----
Metro is moving ...
Wenn getragen: 5.005

Fertigstellung des Modellbeispiels dieses Beispiels. Bedarfsmessung nach diesem schematisch günstigen Prozess Andere Transportmittel (Nyojo-Schreibtisch, hoch 铁) Leistungszeit, Bedarf 让 Sonstige 们 (飞 Schreibtisch, hoch 铁) Tatsächliche bewegliche Verbindung, Messzeitbedingung Allgemeines Sonstiges 们 Aktuelles Beispiel 传 给 Leistungsproxy Individueller anspruchsloser selbstaktueller Messtest).

In diesem Beispiel kann PerformanceProxy das tatsächliche bewegliche Beispiel für den Besitz messen. Stellvertreter für andere Stellvertreter wie Hijiro, eine bestimmte Methodenfüllstelle (Reihenfolge der Methodenanpassung), Nisshi-Stempel usw., Tadashi-Nachfrage, Tracking-Proxy, Protokollierungs-Proxy usw. Natürlich ist dies eine triviale Ersatzstadt und aufgrund der Verwendung des anderen Typs ein praktischer beweglicher Hafen:

public static void main(String[] args) {
    Plane plane = new Plane();
    PerformanceProxy pp = new PerformanceProxy(plane);
    LoggingProxy lp = new LoggingProxy(PerformanceProxy);
    lp.move();
}

Statischer Ersatz

Stellvertretender statischer Zustand?

Top-Top-Beispiel des Bildes, Souyoshi Gendai, selbsttätiger Agent, Nachbearbeitung. Diese Stichprobe vor der Einführung des Prozesses den Ersatztyp des Ersatztyps, den Ersatztyp des .class-Satzes (sekundärer Systemsatz), den Ersatztyp des Ersatzsatzes.

Dynamischer Proxy

Der Java-Standard stellte die dynamische Proxy-Funktion zur Verfügung Dynamische Agentur Eigentlich ist es ein vorübergehender Prozess für das JDK. Beispiel für ein allgemeines statisches Surrogat auf der Oberfläche Dynamisches Surrogat für Kinder Realisierung:

public static void main(String[] args) {
    final Metro metro = new Metro();
    Moveable m = (Moveable) Proxy.newProxyInstance(Metro.class.getClassLoader(), //Ersatzklassenlader
            new Class[]{Moveable.class}, //传 Eintritt erforderlich Praktischer Eintritt
            new InvocationHandler() {  //Methodischer InvocationHandler für die Eingabeverarbeitung(Anonym)
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 1
                    long start = System.currentTimeMillis();
                    Object res = method.invoke(metro, args); // 2
                    long end = System.currentTimeMillis();
                    System.out.println("Wenn getragen: " + (end - start)/1000.0);
                    return res; // 3
                }
            });
    m.move(5);
}

// 1.Aufruf Mittlere Anzahl von Teilnehmern Proxy Aktivistischer Proxy auf dem neuesten Stand der Technik; Methode Assoziierte Methode: Verwurzelte ungleiche Methode 做 unterschiedliche Verarbeitung.
// 2. method.invoke(metro, args)Etc..move(), Diese Summe ist eine Zwischenfunktion.call(obj, param)Ähnlich.
// 3.2 Rückgabe mit mittlerer Methode, Rückgabe mit ungültiger Methode null, grundlegende Anzahl von Typen, typbasierte automatische Box (z. B. automatische Ganzzahl für die automatische Konvertierung von Int-Kai).

Ein statischer Messtest für die Oberfläche kann erhalten werden. Statisches Ersatzergebnis für die Oberfläche. Es kann als Proxy für die Operation verwendet werden, und die wichtigsten Anpassungen sind abgeschlossen. Proxy.newProxyInstance (...) Operation und InvocationHandler-like invoke-like methodische Implementierung. Es ist notwendig, das JDK zu sehen, und es ist möglich, die Anzahl der Personen zu messen, die für den Test verantwortlich sind.

// env: JDK1.8 / IntelliJ IDEA 15 / macOS Majave
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

Uki yuki ノ 运 运 运 运 运 运 运 运 运 运 运 运 运 运 运 运 运 运 运 运

#Ersatzposition für Bewegungserzeugung
...
|-- com/
| |--sun/
| | |--proxy/
| | | |--$Proxy0.class
...

Unterseite 译 译 $ Proxy0.class Nachfolgender Teil 蠁: Kann als Proxy gesehen und fungiert werden. Hauptleistung Objekttyp gleich, hashCode sum toString Grundmethode Summe Bewegliche Art der Kontaktmethode verschieben.


// ----- $Proxy0.class
public final class $Proxy0 extends Proxy implements Moveable {
    ...
    public $Proxy0(InvocationHandler var1) throws  { super(var1); }
    public final void move(Integer var1) throws  {
        try {
            super.h.invoke(this, m3, new Object[]{var1}); // 1 
        } ...
    }

    public final boolean equals(Object var1) throws  { ... }
    public final String toString() throws  { ... }
    public final int hashCode() throws  { ... }

    static {
        try {
            m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[]{Class.forName("java.lang.Object")});
            m3 = Class.forName("proxy.lizi.Moveable").getMethod("move", new Class[]{Class.forName("java.lang.Integer")});
            ...
        } ...
    }
}

Schlachtung auf der Oberseite (1 Position) super.h Assistenzhandbuch InvocationHandler Beispiel, m3 kann folgen InvocationHandler für die tatsächliche Anpassung InvocationHandler Eine beispielhafte Aufrufmethode. Nachlassende Zeiteinführung Einfache Beschreibung abgeschlossen Der oben erwähnte dynamische Proxy-Aufbau und -Prozess: times.png

Hinweis: Yu JDK Genroku Approval Arriving State Proxy Praktische Methode: Java-ähnliche Reflexkontrolle + ASM (einteiliger, handhabbarer, schwertartiger Charakterrahmen). Klassifizierung und Methode des beweglichen Zustands der Reflexionssteuerung, jedoch zur Begrenzung der Steuerung und Einstellung: ASM kann direkt mit dem Zeichen 节 码 (Text der Klasse) usw. betrieben werden.

Beispielkind für dynamische Ersatzanwendung

Mein Batis

MyBatis Koichi Subsection Hervorragender ausdauernder Layered Frame, andere Unterstützung für standardisiertes SQL, Projektion auf hoher Ebene über die Existenzgeschichte hinaus. Verwenden Sie MyBatis Time General Demand Photograph Mapper.xml Platzierungs- und Verbindungserklärung XXXMapper.java, Nyoshita:

<!-- XXXMapper.xml -->
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="tk.mybatis.simple.mapper.UserMapper">
    <select id="selectById" resultMap="userMap">
        SELECT * from sys_user where id = #{id}
    </select>
    <select id="selectAll" resultType="tk.mybatis.simple.model.SysUser"> 
    	select id,
		user_name userName
	from sys_user
    </select>
    ...
</mapper>

// ---- UserMapper.java
public interface UserMapper {
	/**
	 *Pass id 查 询 户
	 * 
	 * @param id
	 * @return
	 */
	SysUser selectById(Long id);
	
	/**
	 *查 询 im Besitz 户
	 * 
	 * @return
	 */
	List<SysUser> selectAll();
}

Mapper-Kontaktmethode für die normale Anpassung, dies ist die Ursache für MyBaits. Grundprinzipien Durchlaufen der XML-Sprachführer-Anordnung Neurooting der Mapper-Kontaktierungsmethode Tatsächlich.

Dynamischer stellvertretender Yukiyuki-Frühling

Spring Frame Core Policy IoC (Inversion of Control) summiert AOP (Aspect Oriented Programming). Spring Bean-ähnliche Abhängigkeitsinjektion (DI: Can-Passing-XML-Methode, Kommentierungsmethode nach japanischem Vorbild) und andere Face-to-Face-Annäherungsmethoden sind enthalten, und die tatsächliche Bedingung wird verwendet. cglib (Code Generation Library) Prinzipien Dynamische Statusgenerierung abgeschlossen Zur Einstellung überqueren Sie die Kreuzung. cglib-artiger unterer geschichteter, verwendeter ASM-Stil.

Recommended Posts

Java Dynamic Proxy
Java
Java
Eine Instanz der Annotation ist Dynamic Proxy
[Java] So legen Sie den Proxy beim Starten von Java fest
Verwenden des Proxy-Dienstes mit Java-Crawling
Java lernen (0)
Java studieren ―― 3
[Java] -Array
Java geschützt
[Java] Anmerkung
Lassen Sie uns DynamicProxy so einfach wie möglich erklären
[Java] Modul
Java-Array
Java studieren ―― 9
Java Scratch Scratch
Java-Tipps, Tipps
Java-Methoden
Java-Methode
Java (Konstruktor)
Java-Array
[Java] ArrayDeque
Java (überschreiben)
Java (Methode)
Java-Zeichenfolge
Java (Array)
Java-Serialisierung
Java Anfänger 4
JAVA hat bezahlt
Java studieren ―― 4
Java (gesetzt)
Java-Shell-Sortierung
[Java] compareTo
Java studieren -5
Java reflektierend 获 获 举
Java (Schnittstelle)
Java-Memorandum
Java-Array
Java studieren ―― 1
[Java] Polymorphismus
Java # 0 studieren
Java-Überprüfung
Java-Funktionen
[Java] Vererbung
FastScanner Java
Java-Funktionen
Proxy-Muster
Java-Memo
Java (Kapselung)
Java-Vererbung
[Java] Überladung
Java-Grundlagen
Java dekompilieren
[Java] Anmerkung
Java Note
Java Anfänger
Java (add2)
JAVA (Karte)
[Java] -Schnittstelle
Java9-Sammlung