English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Negli ultimi due giorni, ha visto la parte di proxy di Hibernate, la prima reazione è che il livello di base utilizza la reflection per generare proxy classi per l'entità utente. Dopo aver riflettuto, ha capito che la reflection non ha la capacità di generare nuove classi, quindi naturalmente ha trovato Javassist (indirizzo di download).
La maggior parte delle guide trovate online sono dedicate alla spiegazione dell'API di Javassist, ma alla fine, spesso non c'è un processo di caricamento. Durante l'imitazione di questi tutorial per il caricamento delle classi, i risultati caricati sono sempre le classi originali, senza generare il contenuto del bytecode modificato.
Dopo una serie di esplorazioni, l'autore ha scoperto che la maggior parte delle guide online utilizzano la versione senza parametri di writeFile per salvare il bytecode. Dopo aver esaminato la struttura della funzione, ha scoperto che c'è anche una versione con tipo String. Poiché nella versione Eclipse, la posizione di base di archiviazione del bytecode non è “.\\” ma “.\\bin”, l'altra versione di writeFile potrebbe essere il parametro che specifica la posizione di base del bytecode. Dopo alcune modifiche, l'autore ha scoperto che è esattamente così.
Di seguito, verrà condiviso il codice:
Questo è la struttura del mio progetto:
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"); // Impostare il percorso radice. (Il percorso radice impostato qui non viene utilizzato da writeFile) CtClass cc = pool.makeClass("com.thrblock.javassist.EditableChanged"); // Simulare il modello di proxy Hibernate, creiamo una nuova classe cc.setSuperclass(pool.get("com.thrblock.javassist.Editable")); // Impostare la superclasse CtMethod cm = CtNewMethod.make("public void showInfo(){super.showInfo();System.out.println(\"CustomInsertHAHA!\");}",cc); // Aggiungere un metodo, notare che sovrascrive il metodo della superclasse. cc.addMethod(cm); cc.writeFile(".\\bin"); // E 'qui è molto importante, il risultato senza parametri non viene salvato nel percorso radice dei bytecode di eclipse. } catch (NotFoundException | CannotCompileException | IOException e) { e.printStackTrace(); } try{ Class<?> cl = Class.forName("com.thrblock.javassist.EditableChanged"); //Carica la nostra nuova classe Editable ed = (Editable) cl.newInstance(); //Poiché eredita dalla classe Editable, è uguale al principio di load in Hibernate. ed.showInfo(); //Chiamata al metodo. } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { e.printStackTrace(); } } }
Risultato di stampa:
InfoDefault!
CustomInsertHAHA!
Altri punti da notare:
Poiché abbiamo generato una classe, se il nome della classe è lo stesso del nome originale, il file class verrà sovrascritto. Tuttavia, se la classe è stata già caricata nel JVM prima della modifica, la parte modificata non avrà effetto e il JVM deve essere riavviato.
Sommario
Questo è tutto il contenuto di questo articolo sull'analisi del codice di utilizzo corretto di Javassist sotto Eclipse, speriamo che sia utile a tutti. Gli amici interessati possono continuare a consultare altre sezioni correlate di questo sito, e sono benvenuti a lasciare commenti per eventuali insufficienze. Grazie per il supporto degli amici a questo sito!
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright è di proprietà del rispettivo proprietario, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato editato manualmente e non assume responsabilità per le relative responsabilità legali. Se trovi contenuti sospetti di violazione del copyright, sei invitato a inviare una e-mail a notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente i contenuti sospetti di violazione del copyright.