J'ai vu la partie indirecte de l'hibernate au cours des deux derniers jours. La première réaction a été que la couche sous-jacente a utilisé la réflexion et généré une classe proxy pour l'entité utilisateur. Plus tard, j'ai réalisé que la réflexion n'avait aucune capacité de générer de nouvelles classes, donc j'ai naturellement trouvé Javassist (adresse de téléchargement).
La plupart des tutoriels recherchés en ligne sont expliqués à l'API Javassiste, mais en fin de compte, il n'y a souvent pas de processus de chargement. Lorsque l'auteur imite ces tutoriels pour le chargement des classes, les résultats chargés sont la classe d'origine et aucun contenu avec le bytecode modifié.
Après une certaine exploration, l'auteur a constaté que la dernière étape de la plupart des tutoriels sur Internet, l'enregistrement de Bytecode est utilisée pour enregistrer le bytecode. Après avoir vérifié sa structure de fonction, il a constaté qu'il a également une surcharge de type de chaîne. Parce que sous Eclipse, la position racine du bytecode n'est pas ".//" mais ".//bin", et une autre surcharge de WriteFile est probablement le paramètre spécifiant la position racine du bytecode. Après quelques changements, j'ai trouvé que c'était vrai.
Ce qui suit est le code de démonstration:
Ceci est la structure du projet de l'auteur:
Editable.java: package com.thrblock.javassist; classe publique Editable {public void showInfo () {System.out.println ("InfodeFault!"); }} Main.java: package com.thrblock.javassist; import java.io.ioException; import javassist.cannotcompileException; import javassist.classpool; import javassist.ctclass; import javassist.ctMethod; args) {classpool pool = classpool.getDefault (); essayez {pool.insertClassPath (".// bin"); // définit le chemin racine. (Le chemin racine défini ici n'est évidemment pas utilisé par WriteFile) ctclass cc = pool.makeclass ("com.thrblock.javassist.editableChanged"); // simule le mode proxy hibernate, nous créons une nouvelle classe cc.setSuperclass (pool.get ("com.thrblock.javassist.editable"); // set its keare classe CTMETHCMIST. CtNewMethod.Make ("public void showInfo () {super.showinfo (); System.out.println (/" CustomInserthaha! / ");}", Cc); // Ajouter une méthode, notez qu'il remplace les méthodes de la classe parent. CC.AddMethod (CM); CC.WriteFile (".// bin"); // c'est plus important. Le résultat du paramètre NULL est qu'il n'est pas enregistré dans le chemin racine du code Eclipse Bytecode. } Catch (NotfoundException | NodCompileException | ioException e) {e.printStackTrace ();} try {class <?> cl = class.forname ("com.thrblock.javassist.editableChanged"); // Chargez notre nouvelle classe modifiable = (modifiable) Cl.NewinSitance (); // Parce que c'est dans le principe de la charge dans la charge dans dans dans dans le principe (); Hibernate. ed.showinfo (); // appelant la méthode. } catch (classNotFoundException | InstantiationException | illégalaccessException e) {e.printStackTrace ();}}}Résultat d'impression:
InfodeFault!
Custominserthaha!
Autres notes:
Étant donné que nous avons généré une classe, si le nom de classe est le même que le nom de classe d'origine, le fichier de classe sera écrasé. Cependant, si la classe a été chargée par le JVM avant modification, la pièce modifiée ne prendra pas effet et le JVM doit être redémarré.
Résumer
Ce qui précède est tout le contenu de cet article sur la méthode d'utilisation correcte de Javassist sous Eclipse. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!