Toutes les analyses avec Javassist

Préambule

En Java, les textes de classe appartenant à la ville, les textes édités, les textes édités, les textes édités, les textes édités, les textes édités, les textes édités, et les textes édités et modifiés, Comment augmenter, ainsi qu'une entrée profonde, syllabaire et réduction peu exigeante.

创 Classe KEN

创 Objet KEN Maven, Javassist à tirer 库

<!-- https://mvnrepository.com/artifact/javassist/javassist -->
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.1.GA</version>
        </dependency>

Utilisez le javassiste Kenichi Kuruma Personal

package com.y4er.learn;

import javassist.*;


public class CreateClass {
    public static void main(String[] args) throws Exception {
        //获 tori javassist
        ClassPool pool = ClassPool.getDefault();

        //创 军 决.y4er.learn.Person
        CtClass ctClass = pool.makeClass("com.y4er.learn.Person");

        //给 ctClass type addition 1 pièce type de chaîne type caractère nom de l'étape
        CtField name = new CtField(pool.get("java.lang.String"), "name", ctClass);

        //Réglage privé
        name.setModifiers(Modifier.PRIVATE);

        //Nom d'initialisation étape de caractère zhangsan
        ctClass.addField(name, CtField.Initializer.constant("zhangsan"));

        //Générer la méthode get, set
        ctClass.addMethod(CtNewMethod.getter("getName",name));
        ctClass.addMethod(CtNewMethod.setter("setName",name));

        //Numéro de boîte de construction sans additif
        CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass);
        ctConstructor.setBody("{name=\"xiaoming\";}");
        ctClass.addConstructor(ctConstructor);

        //Structure de participation additive
        CtConstructor ctConstructor1 = new CtConstructor(new CtClass[]{pool.get("java.lang.String")}, ctClass);
        ctConstructor1.setBody("{$0.name=$1;}");
        ctClass.addConstructor(ctConstructor1);

        //Jian Jian une méthode publique printName()Pas de participation, pas de retour
        CtMethod printName = new CtMethod(CtClass.voidType, "printName", new CtClass[]{}, ctClass);
        printName.setModifiers(Modifier.PUBLIC);
        printName.setBody("{System.out.println($0.name);}");
        ctClass.addMethod(printName);

        //Copier le texte du cours
        ctClass.writeFile();
        ctClass.detach();
    }
}

Terminé après l'achèvement de la production Person.class image.png

comment utiliser

Classe représentative CtClass dans javassist, conteneur ClassPool CtClass, ClassPool 维 护 虤 证 , CtClass.detach () pour l'ajustement de la demande.

Priorité ClassPool Oui En dessous de la méthode individuelle:

  1. getDefault () Exemple unique 获 tori ClassPool
  2. appendClassPath () ClassPath
  3. insertClassPath () Insérer le fichier jar ClassPath
  4. get () Nom racine 获 tori CtClass
  5. toClass () General CtClass Transforming Class Une fois converti et ne peut pas être converti
  6. makeClass ()

Plus de formulaire du trésorier: http://www.javassist.org/html/javassist/ClassPool.html

Méthode liée à la demande CtClass:

  1. addConstructor () Ajouter une boîte de structure
  2. addField () Ajouter une étape de caractère
  3. addInterface () Ajouter un port
  4. addMethod () Méthode Add
  5. freeze () Réparation de réparation inutilisable
  6. dégivrage () Réhabilitation
  7. detach () 来 ClassPool
  8. toBytecode ()
  9. Classe de transformation toClass ()
  10. writeFile () Copie le texte .class
  11. setModifiers ()

Étapes: http://www.javassist.org/html/javassist/CtClass.html

Acceptation CtMethod CtBehavior, méthode liée à la demande:

  1. insérerAvant
  2. insterAfter retour des résidents
  3. insertAt Frais d'insertion de position spécifiée
  4. setBody Réglage du contenu de la méthode générale requis Méthode de copie, cette méthode de réparation abstraite, le transfert de marque de réparation
  5. créer une nouvelle méthode

Plus d'étapes: http://www.javassist.org/html/javassist/CtBehavior.html

Actuellement setBody () Nakaga 们 utilise le numéro représentatif du code $

// $0 représentant ce$1 Classement du 1er numéro d'inscription individuel représentatif
printName.setBody("{System.out.println($0.name);}");

Utiliser la génération CtClass

Au-dessus de la phrase, j'ai généré un Person.class conforme à l'opposition ctClass, 怎么 pour l'ajustement Opposition de génération de type de personne, attribut d'ajustement ou méthode?

Trois méthodes:

  1. Pour la méthode de réflexion
  2. Texte de la classe d'addition
  3. Port de passage

Pour le réglage de la réflexion

//Illustrative
Object o = ctClass.toClass().newInstance();
Method setName = o.getClass().getMethod("setName", String.class);
setName.invoke(o,"Y4er");
Method printName1 = o.getClass().getMethod("printName");
printName1.invoke(o);

Texte de la classe d'addition

ClassPool pool = ClassPool.getDefault();
pool.appendClassPath("E:\\code\\java\\javassist-learn\\com\\y4er\\learn");
CtClass PersonClass = pool.get("com.y4er.learn.Person");
Object o = PersonClass.toClass().newInstance();
//Pour le réglage de la réflexion subordonnée

Pour passer la connexion

Port de contact nouvellement construit IPerson, méthode générale de type Personne Tout résumé

package com.y4er.learn;

public interface IPerson {
    String getName();

    void setName(String name);

    void printName();
}
ClassPool pool = ClassPool.getDefault();
pool.appendClassPath("E:\\code\\java\\javassist-learn\\com\\y4er\\learn\\Person.class");

CtClass IPerson = pool.get("com.y4er.learn.IPerson");
CtClass Person = pool.get("com.y4er.learn.Person");
Person.defrost();
Person.setInterfaces(new CtClass[]{IPerson});

IPerson o = (IPerson) Person.toClass().newInstance();
o.setName("aaa");
System.out.println(o.getName());
o.printName();

Général Type de personne Le point de contact IPerson réel, type de conversion directe au moment du cas réel, peut être directement ajusté.

Rénovation de type existant

javassiste La majorité des affaires de rénovation et de rénovation de type, le visage de l'épéiste. Mon usage personnel

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.y4er.learn;

public class Person implements IPerson {
    private String name = "zhangsan";

    public String getName() {
        return this.name;
    }

    public void setName(String var1) {
        this.name = var1;
    }

    public Person() {
        this.name = "xiaoming";
    }

    public Person(String var1) {
        this.name = var1;
    }

    public void printName() {
        System.out.println(this.name);
    }
}

En ce moment, mes pensées printName

------ printName start ------
xiaoming
------ printName  over ------

Shaichi Shimodai:

pool.appendClassPath("E:\\code\\java\\javassist-learn\\com\\y4er\\learn\\Person.class");
CtClass Person = pool.get("com.y4er.learn.Person");
Person.defrost();

CtMethod printName1 = Person.getDeclaredMethod("printName", null);
printName1.insertBefore("System.out.println(\"------ printName start ------\");");
printName1.insertAfter("System.out.println(\"------ printName  over ------\");");

Object o = Person.toClass().newInstance();
Method printName2 = o.getClass().getMethod("printName");
printName2.invoke(o, null);

Réalisation de Tsujimatsu visage terminé image.png

Recommended Posts

Toutes les analyses avec Javassist
[Java] Jugement de spam utilisant l'analyse morphologique "lucene-gosen"