Javassist. Was ist der Grundgedanke und wo der Reale nutzen?
Ich weiß, dass Javassist ist eine Java-Bibliothek, die ein Mittel zur Manipulation der Java-bytecode einer Anwendung.
Ok, aber warum müssen wir die bytecode manipulieren?
Jede Reale Beispiel?
Jeder echte app, wo javassist verwendet?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine häufige Anwendung ist die Generierung von proxy-Klassen zur Laufzeit, D. H. zum erstellen einer Unterklasse zur Laufzeit fängt alle Methodenaufrufe. Beispiele:
Hibernate Proxys verwendet, um abfangen von Methodenaufrufen auf Entitäten zu implementieren, lazy loading, also Holen Sie das Objekt aus der Datenbank, wenn es zum ersten mal aufgerufen wird.
Den Spring Framework Proxys verwendet, um die Umsetzung Ihrer AOP-Unterstützung, die unter anderem Befugnisse seine Unterstützung für deklarative Transaktionen. Es verwendet auch die Proxys zu erzwingen Gültigkeitsbereichs.
EJB verwendet proxies zu implementieren container-verwalteten Transaktionen, die Berechtigungsprüfung und user-defined-Abfangjäger.
CDI - Implementierungen müssen auch als proxy für die managed beans, um die ordnungsgemäße Festlegung des lösungsumfangs. Ich vermute, Sie verwenden ein byte code engineering library, zu.
Ich vor kurzem verwendet Javassist zu implementieren ein transparentes cache-Methode, die Werte zurückgeben, indem er alle Methodenaufrufe und nur delegieren, der super-Umsetzung auf dem ersten Aufruf.
Beachten Sie, dass
java.lang.reflect.Proxy
kann die Generierung von proxy-Klassen zur Laufzeit, sondern kann nur interfaces implementieren, nicht eine Klasse erweitern. Alle oben genannten Anwendungsfälle erfordern die Proxyfunktion von Klassen.Bytecode-manipulation ist nützlich und notwendig, vor allem, wenn Sie nicht mit source-code für bestimmte Projekte. Sagen Sie, dass Sie nur den bytecode (wie eine jar-Datei) für ein Projekt, aber Sie wollen irgendwie ändern das Verhalten des Codes, der bytecode manipulation library in solchen Fällen helfen kann. Der Vorteil von bytecode-manipulation ist, dass Sie brauchen nicht zu kompilieren Sie Ihren code und direkt durchführen können es nach manipulation.
Habe ich verwendet, bytecode-manipulation, um einige der Programm-Analyse. Gegeben eine Bibliothek, ich will wissen, während der Laufzeit, welche Methoden in der Bibliothek aufgerufen worden. Ich kann die Verwendung von bytecode-manipulation einfügen
System.out.println("method_name");
- Anweisung am Anfang einer Methode. Also während der Laufzeit, wird es ausdrucken, welche Methoden aufgerufen worden.Einige bytecode-manipulation Bibliotheken sind:
Erweitern Meriton beantworten und ein echtes Beispiel für die Verwendung :
Hibernate-core (5.2.8.Final) verwenden javaassit (3.20.0-GA):
https://mvnrepository.com/artifact/org.hibernate/hibernate-core/5.2.8.Final
Benutzer Seite des ASM-Projekt listet mehrere Dutzend verbreitete Java-Projekte und frameworks mit der ASM für die bytecode-Analyse und-manipulation. http://asm.ow2.org/users.html