J'ai essayé la métaprogrammation avec Java

introduction

Utilisation d'une bibliothèque de méta-programmation appelée javassist J'ai essayé de réécrire la classe que j'ai réellement créée.

Vous pouvez l'utiliser lorsque vous utilisez la bibliothèque et pensez que c'est de la merde. (Un journal mystérieux est sorti, etc ...)

Importer la bibliothèque

J'utilise gradle.

build.gradle


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

Réécrire en fait

Réécrivez en fait la classe préparée appelée User, Ajoutez un champ appelé argent.

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 {
            //Obtenez des piscines pour toutes les classes.
            ClassPool pool = ClassPool.getDefault();

            //Données complètes du nom du package et du nom de la classe.Rechercher un utilisateur
            //S'il n'est pas trouvé, une exception sera levée.
            CtClass ctc = pool.get("data.User");

            //Spécifiez le type de champ, le nom du champ et la destination de la déclaration dans les arguments.
            CtField field = new CtField(CtClass.intType, "money", ctc);

            //Spécifier le modificateur de champ
            //S'il y a plusieurs modificateurs|Je vais l'ajouter avec.
            // field.setModifiers(Modifier.STATIC | Modifier.PRIVATE);
            field.setModifiers(Modifier.PRIVATE);

            //Ajouter le champ.
            ctc.addField(field);

            //Obtenez la méthode définie.
            CtMethod method = ctc.getDeclaredMethod("getUserInfo");
            //Changé pour produire de l'argent en remplaçant l'intérieur de la méthode.
            method.setBody("return \"name: \" + name + \", age: \" + age + \", money: \" + money;");

            //Écraser la classe dans le chargeur de classe.
            Class cls = ctc.toClass(ClassLoader.getSystemClassLoader(), AsmTest.class.getProtectionDomain());

            //Créez une instance de la classe avec réflexion.
            User ins = (User) cls.newInstance();
            ins.setName("Bob");//Spécifiez Bob comme nom.

            //Puisque l'argent est ajouté après la compilation, obtenez-le par réflexion.
            Field f = cls.getDeclaredField("money");

            //Accessibilité modifiée.
            //S'il est privé ou protégé, définissez-le sur true pour qu'il soit accessible.
            f.setAccessible(true);

            //Changez le champ money à 1500 avec int.
            f.setInt(ins, 1500);

            //Sortie réelle.
            System.out.println("name: " + ins.getName());
            System.out.println("money: " + f.getInt(ins));
            System.out.println(ins.getUserInfo());
        } catch (Exception e) {
            //Affiche une erreur.
            System.out.println(e);
        }
    }
}

Quand tu cours

Le résultat est ...

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

Comment, le domaine appelé argent augmente, Vous pouvez changer la valeur.

Résumé

Je n'ai introduit que l'ajout de ce champ, mais comme il y a diverses autres fonctions Veuillez l'utiliser par tous les moyens.

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

Recommended Posts

J'ai essayé la métaprogrammation avec Java
J'ai essayé d'utiliser JWT en Java
J'ai essayé d'utiliser l'API Elasticsearch en Java
J'ai essayé le nouveau yuan à Java
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
J'ai essayé de créer une compétence Alexa avec Java
J'ai fait une roulette à Java.
J'ai essayé Drools (Java, InputStream)
J'ai essayé d'utiliser Java REPL
Essayé l'API Toot et Streaming de Mastodon en Java
J'ai essayé d'implémenter la notification push Firebase en Java
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
J'ai essayé de créer une compétence Clova en Java
J'ai essayé d'utiliser l'instruction Extended for en Java
J'ai essayé de passer Java Silver en 2 semaines sans connaître Java
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai envoyé un e-mail en Java
J'ai essayé d'interagir avec Java
J'ai essayé la communication UDP avec Java
J'ai écrit le théorème de Gordobach en java
J'ai essayé de mettre Domino11 dans CentOS7
J'ai essayé d'utiliser l'API Java8 Stream
J'ai fait une annotation en Java.
J'ai essayé de résumer Java 8 maintenant
J'ai essayé d'utiliser le mémo Java LocalDate
J'ai essayé d'utiliser Google HttpClient de Java
J'ai essayé d'utiliser Dapr en Java pour faciliter le développement de microservices
J'ai créé un client RESAS-API en Java
J'ai essayé un problème de calendrier avec Ruby
Partition en Java
J'ai essayé le mappeur d'objets de Cassandra pour Java
J'ai essayé de résumer les expressions Java lambda
J'ai essayé de configurer les débutants Java pour qu'ils utilisent des touches de raccourci dans eclipse
Janken à Java
J'ai essayé Spring.
J'ai essayé de mettre Tomcat
J'ai essayé d'utiliser OpenCV avec Java + Tomcat
J'ai fait l'étalonnage de la caméra OpenCV en Java
J'ai essayé de refactoriser ①
J'ai essayé la bibliothèque AutoValue avec Intellij
Taux circonférentiel à Java
J'ai essayé l'examen d'entrée de Google (non officiel) [java]
J'ai essayé FizzBuzz.
[* Java *] J'ai participé au JJUG CCC 2019 Spring
FizzBuzz en Java
J'ai essayé JHipster 5.1
J'ai essayé d'incorporer une formule dans Javadoc
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
J'ai créé un programme de jugement des nombres premiers en Java
[Pour les débutants] J'ai essayé d'utiliser DBUnit avec Eclipse
J'ai essayé de mettre facilement Java sur mon Mac
J'ai essayé d'implémenter des relations polymorphes à Nogizaka.
[Pour les débutants] J'ai essayé d'utiliser JUnit 5 avec Eclipse
Je souhaite envoyer un e-mail en Java.
J'ai essayé d'organiser la session en Rails
java j'ai essayé de casser un simple bloc
J'ai essayé de frapper une méthode Java d'ABCL