Ich habe versucht, Metaprogrammierung mit Java

Einführung

Verwenden einer Metaprogrammierbibliothek namens javassist Ich habe versucht, die Klasse, die ich tatsächlich erstellt habe, neu zu schreiben.

Sie können es verwenden, wenn Sie die Bibliothek verwenden und denken, es ist Scheiße. (Es wird ein mysteriöses Protokoll ausgegeben usw.)

Bibliothek importieren

Ich benutze Gradle.

build.gradle


...
dependencies {
...
    compile group: 'org.javassist', name: 'javassist', version: '3.15.0-GA'
}

Eigentlich umschreiben

Schreiben Sie die vorbereitete Klasse namens User tatsächlich neu. Fügen Sie ein Feld namens Geld hinzu.

data/User.java


package data;

public class User {
    private String name;

    private int age;

    private float height;
    private float width;

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

    public String getName() {
        return name;
    }

    public String getUserInfo() {
        return "name: " + name + ", age: " + age;
    }
}

Main.java


import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtMethod;
import javassist.Modifier;

public class Test {
    public static void main(String[] args) {
        try {
            //Holen Sie sich Pools für alle Klassen.
            ClassPool pool = ClassPool.getDefault();

            //Vollständige Daten des Paketnamens und des Klassennamens.Suche nach Benutzer
            //Wenn nicht gefunden, wird eine Ausnahme ausgelöst.
            CtClass ctc = pool.get("data.User");

            //Geben Sie in den Argumenten den Feldtyp, den Feldnamen und das Deklarationsziel an.
            CtField field = new CtField(CtClass.intType, "money", ctc);

            //Geben Sie den Feldmodifikator an
            //Wenn es mehrere Modifikatoren gibt|Ich werde es mit hinzufügen.
            // field.setModifiers(Modifier.STATIC | Modifier.PRIVATE);
            field.setModifiers(Modifier.PRIVATE);

            //Feld hinzufügen.
            ctc.addField(field);

            //Holen Sie sich die definierte Methode.
            CtMethod method = ctc.getDeclaredMethod("getUserInfo");
            //Geändert, um Geld auszugeben, indem das Innere der Methode ersetzt wird.
            method.setBody("return \"name: \" + name + \", age: \" + age + \", money: \" + money;");

            //Klasse im Klassenlader überschreiben.
            Class cls = ctc.toClass(ClassLoader.getSystemClassLoader(), AsmTest.class.getProtectionDomain());

            //Erstellen Sie eine Instanz einer Klasse mit Reflektion.
            User ins = (User) cls.newInstance();
            ins.setName("Bob");//Geben Sie Bob als Namen an.

            //Da Geld nach der Zusammenstellung hinzugefügt wird, erhalten Sie es durch Reflexion.
            Field f = cls.getDeclaredField("money");

            //Zugänglichkeit geändert.
            //Wenn privat oder geschützt, setzen Sie es auf true, damit auf es zugegriffen werden kann.
            f.setAccessible(true);

            //Ändern Sie das Geldfeld mit int auf 1500.
            f.setInt(ins, 1500);

            //Tatsächliche Ausgabe.
            System.out.println("name: " + ins.getName());
            System.out.println("money: " + f.getInt(ins));
            System.out.println(ins.getUserInfo());
        } catch (Exception e) {
            //Fehler ausgeben.
            System.out.println(e);
        }
    }
}

Wenn du rennst

Ergebnis ist ...

name: Bob
money: 1500
name: Bob, age: 0, money: 1500

Wie, das Feld namens Geld wächst, Sie können den Wert ändern.

Zusammenfassung

Ich habe nur das Hinzufügen dieses Feldes eingeführt, aber da gibt es verschiedene andere Funktionen Bitte benutzen Sie es auf jeden Fall.

javassist https://github.com/jboss-javassist/javassist

Recommended Posts

Ich habe versucht, Metaprogrammierung mit Java
Ich habe versucht, JWT in Java zu verwenden
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Ich habe das neue Yuan-Problem in Java ausprobiert
Ich habe versucht, neunundneunzig in Java auszugeben
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Ich habe ein Roulette in Java gemacht.
Ich habe Drools (Java, InputStream) ausprobiert.
Ich habe versucht, Java REPL zu verwenden
Versuchte Mastodons Toot- und Streaming-API in Java
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Ich habe versucht, Java Silver in 2 Wochen zu bestehen, ohne Java zu kennen
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe eine E-Mail in Java gesendet
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe Gordobachs Theorem in Java geschrieben
Ich habe versucht, Domino11 in CentOS7 zu integrieren
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe eine Anmerkung in Java gemacht.
Ich habe jetzt versucht, Java 8 zusammenzufassen
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe versucht, Dapr in Java zu verwenden, um die Entwicklung von Mikroservices zu erleichtern
Ich habe einen RESAS-API-Client in Java erstellt
Ich habe ein Kalenderproblem mit Ruby versucht
Partisierung in Java
Ich habe Cassandras Object Mapper für Java ausprobiert
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Ich habe versucht, Java-Anfänger so einzustellen, dass sie Tastenkombinationen in Eclipse verwenden
Janken in Java
Ich habe es mit Spring versucht.
Ich habe versucht, Tomcat zu setzen
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe die OpenCV-Kamerakalibrierung in Java durchgeführt
Ich habe versucht, ① umzugestalten
Ich habe die AutoValue-Bibliothek mit Intellij ausprobiert
Umfangsrate in Java
Ich habe Googles Aufnahmeprüfung (inoffiziell) [Java] ausprobiert.
Ich habe FizzBuzz ausprobiert.
[* Java *] Ich habe am JJUG CCC 2019 Spring teilgenommen
FizzBuzz in Java
Ich habe JHipster 5.1 ausprobiert
Ich habe versucht, eine Formel in Javadoc einzubetten
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
[Für Anfänger] Ich habe versucht, DBUnit mit Eclipse zu verwenden
Ich habe versucht, Java einfach auf meinen Mac zu bringen
Ich habe versucht, polymorph in Nogizaka zu implementieren.
[Für Anfänger] Ich habe versucht, JUnit 5 mit Eclipse zu verwenden
Ich möchte eine E-Mail in Java senden.
Ich habe versucht, die Sitzung in Rails zu organisieren
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe versucht, eine Java-Methode von ABCL zu verwenden