English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Codeanalyse zur richtigen Verwendung von Javassist unter Eclipse

Diese两天我看到了Hibernates Proxy-Teil, die erste Reaktion war, dass die Unterlage Reflection verwendet, um Proxy-Klassen für Benutzer-Entitäten zu generieren. Später kam mir klar, dass Reflection keine Möglichkeit hat, neue Klassen zu erzeugen, und es war also logisch, Javassist (Download-Adresse) zu finden.

Die meisten Tutorials, die im Internet gefunden werden, sind Erklärungen zu den API von Javassist, aber am Ende gibt es oft keinen Ladevorgang. Wenn ich wie diese Tutorials Klassen lädt, erhalte ich immer die ursprüngliche Klasse und es werden keine geänderten Bytecode erstellt.

Nach einigen Ermittlungen fand ich heraus, dass die meisten Tutorials im Internet den letzten Schritt, die Bytecode zu speichern, mit der parameterlosen Überladung von writeFile durchführen. Nachdem ich die Funktionsstruktur überprüft habe, fand ich heraus, dass es auch eine String-Überladung gibt. Da der Basiskatalog für die Speicherung von Bytecode in Eclipse nicht ».\\«, sondern ».\\bin» ist, könnte die andere Überladung von writeFile möglicherweise der Parameter für den Basiskatalog der Bytecode sein. Nach einigen Änderungen fand ich heraus, dass das tatsächlich der Fall ist.

Nach einigen Ermittlungen werde ich den Quellcode teilen:

Dies ist die Struktur meines Projekts:

Editable.java: 
package com.thrblock.javassist; 
public class 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;
import javassist.CtNewMethod;
import javassist.NotFoundException;
public class Main {
	public static void main(String[] args) {
		ClassPool pool = ClassPool.getDefault();
		try{}}
			pool.insertClassPath(".\\bin");
			//Setzen Sie den Root-Pfad. (Der hier gesetzte Root-Pfad wird offensichtlich nicht von writeFile verwendet) 
			CtClass cc = pool.makeClass("com.thrblock.javassist.EditableChanged");
			//Um das Hibernate-Proxy-Modell zu simulieren, erstellen wir eine neue Klasse 
			cc.setSuperclass(pool.get("com.thrblock.javassist.Editable"));
			//Setzen Sie die Elternklasse 
			CtMethod cm = CtNewMethod.make("public void showInfo(){super.showInfo();System.out.println("CustomInsertHAHA!");}",cc);
			//Fügen Sie eine Methode hinzu, beachten Sie, dass sie die Methode der Oberklasse überschreibt. 
			cc.addMethod(cm);
			cc.writeFile(".\\bin");
			//Hier ist etwas sehr Wichtiges, das Ergebnis ohne Parameter wird nicht im Eclipse Bytecode-Wurzelpfad gespeichert.
		}
		catch (NotFoundException | CannotCompileException | IOException e) {
			e.printStackTrace();
		}
		try{}}
			Class<?> cl = Class.forName("com.thrblock.javassist.EditableChanged");
			//Laden unserer neuen Klasse 
			Editableed = (Editable) cl.newInstance();
			//Da es von der Klasse Editable abgeleitet wird, ist es gleich wie das Laden in Hibernate. 
			ed.showInfo();
			//Methodenaufgeruf
		}
		catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

Druckausgabe:

InfoDefault!

CustomInsertHAHA!

Andere wichtige Punkte:

Da wir eine Klasse generiert haben, wird die Class-Datei überschrieben, wenn der Klassename mit dem ursprünglichen Klassennamen übereinstimmt. Wenn der Class jedoch bereits vom JVM geladen wurde, wird der geänderte Teil nicht wirksam und muss JVM neu gestartet werden, um wirksam zu werden.

Zusammenfassung

Das ist der vollständige Inhalt dieses Artikels über die korrekte Verwendung von Javassist unter Eclipse und die Code-Analysis. Ich hoffe, es hilft Ihnen weiter. Freunde, die daran interessiert sind, können andere verwandte Themen auf dieser Website lesen. Bitte hinterlassen Sie Kommentare, wenn es Mängel gibt. Vielen Dank für die Unterstützung der Freunde dieser Website!

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet entnommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine Haftung für rechtliche Verpflichtungen. Wenn Sie Inhalte finden, die möglicherweise urheberrechtlich geschützt sind, senden Sie bitte eine E-Mail an: notice#w3Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet entnommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine Haftung für rechtliche Verpflichtungen. Wenn Sie Inhalte finden, die möglicherweise urheberrechtlich geschützt sind, senden Sie bitte eine E-Mail an: notice#w

Empfohlene Artikel