Saya melihat bagian proxy hibernate dalam dua hari terakhir. Reaksi pertama adalah bahwa lapisan yang mendasarinya menggunakan refleksi dan menghasilkan kelas proxy untuk entitas pengguna. Kemudian, saya menyadari bahwa refleksi tidak memiliki kemampuan untuk menghasilkan kelas baru, jadi saya secara alami menemukan Javassist (alamat unduhan).
Sebagian besar tutorial yang dicari secara online dijelaskan ke Javassist API, tetapi pada akhirnya, seringkali tidak ada proses pemuatan. Ketika penulis meniru tutorial ini untuk pemuatan kelas, hasil yang dimuat adalah kelas asli dan tidak ada konten dengan bytecode yang dimodifikasi.
Setelah beberapa eksplorasi, penulis menemukan bahwa langkah terakhir di sebagian besar tutorial di internet, menyimpan bytecode digunakan untuk menyimpan bytecode. Setelah memeriksa struktur fungsinya, ia menemukan bahwa ia juga memiliki kelebihan jenis string. Karena di bawah Eclipse, posisi root bytecode tidak ".//" Tapi ".//bin", dan kelebihan writefile lain cenderung menjadi parameter yang menentukan posisi root bytecode. Setelah beberapa perubahan, saya menemukan bahwa itu benar.
Berikut ini adalah kode demo:
Ini adalah struktur proyek penulis:
Editable.java: paket com.thrblock.javassist; Public Class Edited {public void showInfo () {System.out.println ("InfoDefault!"); }} Main.java: paket com.thrblock.javassist; impor java.io.ioexception; impor javassist.cannotcompileException; impor javassist.classpool; impor javassist.ctclass; impor javassist.ctmethod; impor javassist.ctnewheewethod; impor javassist. main (string [] args) {classpool pool = classpool.getDefault (); coba {pool.insertClasspath (".// bin"); // atur jalur root. (Set jalur root di sini jelas tidak digunakan oleh writefile) ctclass cc = pool.makeClass ("com.thrblock.javassist.EditableChanged"); // simulasikan Mode Proxy Hibernate, kami membuat ccsedclass (pool. Ctnewmethod.make ("public void showInfo () {super.showinfo (); System.out.println (/" Custominserthaha!/");}", Cc); // Tambahkan metode, perhatikan bahwa ia mengesampingkan metode dalam kelas induk. cc.addmethod (cm); cc.writeFile (".// bin"); // Ini lebih penting. Hasil parameter nol adalah tidak disimpan dalam jalur akar bytecode gerhana. } Catch (NotFoundException | CanTompileException | ioException e) {e.printstacktrace ();} coba {class <?> clelas.forname ("com.thrblock.javassist. Hibernate. ed.showinfo (); // Memanggil metode. } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {E.PrintStackTrace ();}}}Hasil Cetak:
InfoDefault!
Custominserthaha!
Catatan Lainnya:
Karena kami telah menghasilkan kelas, jika nama kelas sama dengan nama kelas asli, file kelas akan ditimpa. Namun, jika kelas telah dimuat oleh JVM sebelum modifikasi, bagian yang dimodifikasi tidak akan berlaku dan JVM harus dimulai ulang.
Meringkaskan
Di atas adalah semua konten dari artikel ini tentang metode penggunaan Javassist yang benar di bawah Eclipse. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!