Alle Analysen mit Javassist

Präambel

In Java die Klassentexte, die der Stadt gehören, die bearbeiteten Texte, die bearbeiteten Texte, die bearbeiteten Texte, die bearbeiteten Texte und die bearbeiteten und reparierten Texte. Wie man den tiefen Einstieg, die Silbe und die Reduktion erhöht und auch anspruchslos macht.

创 KEN-Klasse

Maven-Gegenstand, einziehbarer Javassist

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

Verwenden Sie den Javassisten 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-Typaddition 1-teiliger String-Typ-Typ Zeichenstufenname
        CtField name = new CtField(pool.get("java.lang.String"), "name", ctClass);

        //Privat einstellen
        name.setModifiers(Modifier.PRIVATE);

        //Initialisierungsname Zeichen Stufe Zhangsan
        ctClass.addField(name, CtField.Initializer.constant("zhangsan"));

        //Generiere get, setze Methode
        ctClass.addMethod(CtNewMethod.getter("getName",name));
        ctClass.addMethod(CtNewMethod.setter("setName",name));

        //Additivfreie Baukastennummer
        CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass);
        ctConstructor.setBody("{name=\"xiaoming\";}");
        ctClass.addConstructor(ctConstructor);

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

        //Jian Jian eine öffentliche Methode printName()Keine Teilnahme, keine Rückkehr
        CtMethod printName = new CtMethod(CtClass.voidType, "printName", new CtClass[]{}, ctClass);
        printName.setModifiers(Modifier.PUBLIC);
        printName.setBody("{System.out.println($0.name);}");
        ctClass.addMethod(printName);

        //Klassentext kopieren
        ctClass.writeFile();
        ctClass.detach();
    }
}

Abgeschlossen nach Abschluss der Produktion Person.class image.png

wie benutzt man

Repräsentative CtClass-Klasse in Javassist, ClassPool CtClass-Container, ClassPool 维 护 虤 证 , CtClass.detach () zur Bedarfsanpassung.

ClassPool-Priorität Ja unter der einzelnen Methode:

  1. getDefault () Einzelbeispiel 获 tori ClassPool
  2. appendClassPath () ClassPath
  3. insertClassPath () Fügen Sie das ClassPath-Glas ein
  4. get () Root name 获 tori CtClass
  5. toClass () Allgemeine CtClass-Transformationsklasse Einmal konvertiert und kann nicht konvertiert werden
  6. makeClass ()

Weitere Formulare des Schatzmeisters: http://www.javassist.org/html/javassist/ClassPool.html

Bedarfsbezogene CtClass-Methode:

  1. addConstructor () Strukturfeld hinzufügen
  2. addField () Charakterstufe hinzufügen
  3. addInterface () Port hinzufügen
  4. addMethod () Methode hinzufügen
  5. freeze () Nicht verwendbare Reparatur Reparatur
  6. Abtauen () Rehabilitation
  7. trennen () 来 ClassPool
  8. toBytecode ()
  9. toClass () Transformationsklasse
  10. writeFile () Kopieren Sie .class-Text
  11. setModifiers ()

Schritte: http://www.javassist.org/html/javassist/CtClass.html

CtMethod Acceptance CtBehavior, nachfragebezogene Methode:

  1. Vorab einfügen
  2. insterAfter Repräsentative Besitzrückgabe
  3. Einfügen An der angegebenen Position Einfügungsgebühr
  4. setBody Allgemeine Einstellung des Methodeninhalts erforderlich Kopiermethode, diese Methode abstrakte Reparatur, die Reparaturmarkenübertragung
  5. Machen Sie eine neue Methode

Weitere Schritte: http://www.javassist.org/html/javassist/CtBehavior.html

Derzeit verwendet setBody () Nakaga die Code-Repräsentativnummer $

// $0 Vertreter dies$1 Repräsentative 1. individuelle Eintragsnummer Klassifizierung
printName.setBody("{System.out.println($0.name);}");

Verwenden Sie die CtClass-Generierung

Über dem Satz habe ich eine ctClass-Oppositions-konforme Person.class generiert, 怎么 zur Anpassung Opposition zur Generierung von Personentypen, Anpassungsattribut oder -methode?

Drei Methoden:

  1. Für die Reflexionsmethode
  2. Text der Zusatzklasse
  3. Durchgangshafen

Zur Reflexionseinstellung

//Illustrativ
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);

Zusatzklassentext

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();
//Zur untergeordneten Reflexionseinstellung

Zum Weiterleiten der Verbindung

Neu erstellte IPerson mit einem Kontaktport, allgemeine Personentypmethode Alle Zusammenfassung

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();

Allgemeiner Personentyp Der tatsächliche IPerson-Kontaktpunkt, der direkte Konvertierungstyp zum Zeitpunkt des tatsächlichen Falls, kann direkt angepasst werden.

Renovierung bestehender Typ

javassist Der Großteil der Sanierung und Renovierung für die Mehrheit der Menschen. Persönliche Art der Selbstnutzung:

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

Zu diesem Zeitpunkt sind meine Gedanken 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);

Tsujimatsu Realization Completed Face image.png

Recommended Posts

Alle Analysen mit Javassist
[Java] Spam-Beurteilung mittels morphologischer Analyse "lucene-gosen"