Proxy dynamique Java

Modèle de substitution

Modèle de substitution associé

** Modèle proxy ** (modèle proxy) 23 types de modèle de conception économique n ° 1, modèle proxy dynamique de type Java. Est-ce un modèle de substitut à une infirmière? Graphiques UML schématiques représentatifs de la surface inférieure: 2.png

Participant schématique:

Exemple de schéma de substitution enfant

La pointe du cou a fixé une entrée en forme d'outil de trafic "mobile" représentative:

public interface Moveable {
    /**
     *Distance spécifiée par le mouvement,Depuis kilomètre
     * @param km distance mobile
     */
    void move(Integer km);
}

Approximativement, la méthode de collusion: Metro, la méthode d'exercice, la méthode de déplacement et la méthode d'observation.

public class Metro implements Moveable {
    @Override
    public void move(Integer km) {
        try {
            System.out.println("Metro is moving ...");
            Thread.sleep(km * 1000);  //Temps de transfert d'imitation
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Toutefois, le proxy de performance: Performance Proxy:

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(); //Méthode d'enregistrement Heure de début du réglage
        m.move(km);                              //Réglage de la méthode
        long end = System.currentTimeMillis();   //Méthode temps cohésif
        System.out.println("Lorsqu'il est porté: " + (end - start)/1000.0); // 计算Lorsqu'il est porté
    }
}

Modèle de remplacement de mesure:

public static void main(String[] args) {
    new PerformanceProxy(new Metro()).move(5);
}
----Résultats expérimentaux----
Metro is moving ...
Lorsqu'il est porté: 5.005

Terminé l'achèvement de l'exemple de modèle de cet exemple. Mesure de la demande après ce processus favorable schématique Autres outils de transport (Nyokan desk, High 铁) Temps d'exécution, demande Test de mesure auto-réel individuel peu exigeant).

Cet exemple, PerformanceProxy peut mesurer la possession réelle exemple mobile. Député pour d'autres députés, comme Hijiro, un certain point de remplissage de méthode (ordre de réglage de la méthode), l'estampillage Nisshi, etc. Naturellement, c'est une ville de remplacement triviale, et c'est un port mobile pratique, en raison de l'utilisation de l'autre type:

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

Substitut statique

État statique adjoint?

Exemple top-top de l'image, Souyoshi Gendai, agent autonome, réédition. Cet exemple, avant l'introduction du processus, le type de substitution du type de substitution, le type de substitution de la phrase .class (phrase du système secondaire), le type de substitution du substitut.

Proxy dynamique

Fonction de proxy dynamique fournie par le standard Java, Agence dynamique En fait, c'est un processus de passage pour le JDK. Exemple de substitut statique de surface générale Substitut dynamique enfant Réalisation:

public static void main(String[] args) {
    final Metro metro = new Metro();
    Moveable m = (Moveable) Proxy.newProxyInstance(Metro.class.getClassLoader(), //Chargeur de classe de substitution
            new Class[]{Moveable.class}, //传 Entrée requise Entrée pratique
            new InvocationHandler() {  //Methodical InvocationHandler pour le traitement des entrées(Anonyme)
                @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("Lorsqu'il est porté: " + (end - start)/1000.0);
                    return res; // 3
                }
            });
    m.move(5);
}

// 1.invoke Nombre moyen de participants proxy Proxy comportemental activatif; méthode
// 2. method.invoke(metro, args)Etc..move(), Cette fonction intermédiaire js somme.call(obj, param)Similaire.
// 3.2 Retour de méthode moyenne, méthode void return null, nombre de base de types, boîte automatique basée sur le type (par exemple, conversion automatique int-kai Integer).

Un test de mesure statique de la surface supérieure peut être obtenu Résultat de substitution statique de la surface supérieure. Les principaux ajustements peuvent être effectués au nom de l'état dynamique. Proxy.newProxyInstance (...) Il est nécessaire de voir le JDK, et quand il continue, il peut être mesuré.

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

Vous pouvez le voir à la fin

#Position de substitution de génération de mouvement
...
|-- com/
| |--sun/
| | |--proxy/
| | | |--$Proxy0.class
...

Surface inférieure 译 译 $ Proxy0.class Partie suivante 蠁: Peut être vu et agi comme un proxy. Réalisation principale Type d'objet égal, hashCode sum toString Méthode de base Sum Manière mobile de déplacement de la méthode de contact.


// ----- $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")});
            ...
        } ...
    }
}

Épée de surface supérieure (1 position) super.h Assistance manuelle Exemple InvocationHandler, m3 peut suivre la méthode de mouvement d'examen minutieux de l'épée. InvocationHandler pour l'ajustement réel InvocationHandler Un exemple de méthode d'invocation. Présentation du temps subventionné Description facile terminée La construction et le processus de proxy dynamique mentionnés ci-dessus: times.png

Remarque: Yu JDK Genroku Approval Comprehensive State Proxy Actual Method: contrôle réflexe de type Java + ASM Classification et méthode de l'état mobile de contrôle réfléchissant, mais pour la limite du contrôle et du réglage; ASM peut être directement actionné par le caractère 节 节 (texte .class), etc.

Exemple d'application de substitution dynamique enfant

Mes Batis

MyBatis Koichi Subsection Excellent cadre en couches d'endurance, autre support SQL standardisé, projection de haut niveau au-delà de l'histoire de l'existence. Utilisez MyBatis Time General Demand Photograph Mapper.xml Déclaration de placement et de connexion 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 {
	/**
	 *Identifiant de passe 查 询 户
	 * 
	 * @param id
	 * @return
	 */
	SysUser selectById(Long id);
	
	/**
	 *查 询 Possédé 户
	 * 
	 * @return
	 */
	List<SysUser> selectAll();
}

Méthode de contact Mapper pour un réglage normal, c'est la cause de MyBaits. Principes de base Passer à travers XML Phrasebook Arrangement Re-rooting Mapper Méthode de contact En fait.

Adjoint dynamique Yukiyuki Spring

Spring Frame Core policy IoC (Inversion of Control) sum AOP (Aspect Oriented Programming). Injection de confiance de type Spring bean (DI: méthode XML passant par Can, méthode de commentaire de style japonais) et autres méthodes en face à face. cglib (Code Generation Library) Principes Génération de mouvement terminée Classe individuelle, classe copie lourde requise Possession de substitution Méthode finale non corrigée, méthode d'utilisation dans la classe de méthode de possession d'enfant Pour le réglage, transversal 耻 辑. Couche inférieure de type cglib, stile ASM utilisé.

Recommended Posts

Proxy dynamique Java
Java
Java
Une instance de l'annotation est Dynamic Proxy
[Java] Comment définir le proxy lors du démarrage de Java
Utilisation du service proxy avec l'exploration Java
Apprendre Java (0)
Étudier Java ―― 3
[Java] tableau
Java protégé
[Java] Annotation
Expliquons DynamicProxy aussi facilement que possible
Module [Java]
Tableau Java
Étudier Java ―― 9
Java scratch scratch
Astuces Java, astuces
Méthodes Java
Méthode Java
java (constructeur)
Tableau Java
[Java] ArrayDeque
java (remplacement)
java (méthode)
Chaîne Java
java (tableau)
Sérialisation Java
java débutant 4
JAVA payé
Étudier Java ―― 4
Java (ensemble)
tri shell java
[Java] compareTo
Étudier Java -5
java réfléchissant 获 获 举
java (interface)
Mémorandum Java
Tableau Java
Étudier Java ―― 1
[Java] Polymorphisme
Étudier Java # 0
Revue Java
Fonctionnalités Java
[Java] Héritage
FastScanner Java
Fonctionnalités Java
Modèle de proxy
Mémo Java
java (encapsulation)
Héritage Java
[Java] Surcharge
Les bases de Java
Décompiler Java
[Java] Annotation
note java
java débutant
Java (add2)
JAVA (Carte)
interface [java]
Collection Java9