Ich habe in den letzten zwei Tagen den Proxy -Teil von Hibernate gesehen. Die erste Reaktion war, dass die zugrunde liegende Schicht Reflexion verwendete und eine Proxy -Klasse für die Benutzereinheit erzeugte. Später wurde mir klar, dass Reflexion keine Fähigkeit hatte, neue Klassen zu generieren, daher fand ich Javassist (Download -Adresse) natürlich.
Die meisten Online -Tutorials werden der Javassist -API erklärt, aber am Ende gibt es oft keinen Ladevorgang. Wenn der Autor diese Tutorials für die Klassenbelastung imitiert, sind die geladenen Ergebnisse die ursprüngliche Klasse und kein Inhalt mit dem modifizierten Bytecode.
Nach einigen Erkundungen stellte der Autor fest, dass der letzte Schritt in den meisten Tutorials im Internet, das Sparen von Bytecode zum Speichern des Bytecode verwendet wird. Nach der Überprüfung der Funktionsstruktur wurde festgestellt, dass es auch eine Überlastungstyp -Überladung hat. Denn unter Eclipse ist die Stammposition des Bytecode nicht ".//" Aber ".//bin" und eine weitere Überladung von Writefile ist wahrscheinlich der Parameter, der die Stammposition des Bytecode angibt. Nach einigen Änderungen stellte ich fest, dass es wahr war.
Das Folgende ist der Demo -Code:
Dies ist die Struktur des Autorprojekts:
Editable.java: paket com.thrblock.javassist; public class editable {public void showInfo () {System.out.println ("InfodeFault!"); }} Main.java: paket com.thrblock.javassist; import java.io.ioxception; import Javassist args) {classpool pool = classpool.getDefault (); try {pool.insertClassPath (".// Bin"); // Setzen Sie den Stammpfad. (Der hier festgelegte Root -Pfad wird offensichtlich nicht von WriteFile verwendet) ctclass cc = pool.makeclass ("com.thrblock.javassist CtnewMethod.make ("public void showInfo () {Super.ShowInfo (); System.out.println (/" CustomInSerthaha!/");}", CC); // Fügen Sie eine Methode hinzu, die die Methoden in der übergeordneten Klasse überschreibt. cc.addmethod (cm); cc.writeFile (".// Bin"); // Dies ist wichtiger. Das Ergebnis des NULL -Parameters ist, dass er nicht im Eclipse -Bytecode -Root -Pfad gespeichert wird. } catch (NotFoundException | kann nicht compileException | ioException e) {e.printstacktrace ();} try {class <> cl = class.Forname ("com.thrblock.javassist Winterschlaf. ed.showinfo (); // die Methode aufrufen. } catch (classNotFoundException | InstantiationException | illegalAccessException e) {e.printstacktrace ();}}}Druckergebnis:
InfodeFault!
CustomInerthaha!
Andere Anmerkungen:
Da wir eine Klasse generiert haben, wird die Klassendatei überschrieben, wenn der Klassenname mit dem ursprünglichen Klassennamen übereinstimmt. Wenn die Klasse jedoch vor der Änderung von der JVM geladen wurde, wird der geänderte Teil nicht wirksam und die JVM muss neu gestartet werden.
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels über die korrekte Verwendungsmethode des Javassisten unter Eclipse. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!