1. Bagaimana mekanisme refleksinya?
Sederhananya, mekanisme refleksi berarti program dapat memperoleh informasinya sendiri saat dijalankan. Di Java, selama nama kelas diberikan, semua informasi tentang kelas tersebut dapat diperoleh melalui mekanisme refleksi.
2. Dimana mekanisme refleksi digunakan?
Terkadang, kami telah menggunakan beberapa pengetahuan, tetapi kami tidak tahu apa terminologi profesionalnya. Saat kami baru mempelajari jdbc, kami menggunakan sebaris kode, Class.forName("com.mysql.jdbc.Driver.class"). newInstance() ; Namun pada saat itu, saya hanya mengetahui bahwa baris kode tersebut menghasilkan instance objek driver, dan saya tidak mengetahui arti spesifiknya. Setelah mendengarkan pelajaran tentang mekanisme refleksi, saya menyadari bahwa ini adalah refleksi. Saat ini, banyak framework terbuka yang menggunakan mekanisme refleksi.
3. Kelebihan dan Kekurangan Mekanisme Refleksi
Mengapa menggunakan mekanisme refleksi? Bukankah cukup dengan membuat objek secara langsung? Ini melibatkan konsep dinamis dan statis.
Kompilasi statis: Jenisnya ditentukan pada waktu kompilasi dan objeknya terikat, yaitu diteruskan.
Kompilasi dinamis: menentukan tipe dan mengikat objek saat runtime. Kompilasi dinamis memaksimalkan fleksibilitas Java, mewujudkan aplikasi polimorfik, dan mengurangi penggabungan antar kelas.
Singkatnya, keuntungan dari mekanisme refleksi adalah ia dapat secara dinamis membuat objek dan mengkompilasinya, yang menunjukkan fleksibilitas yang tinggi. Terutama dalam pengembangan J2EE, fleksibilitasnya sangat jelas. Misalnya, untuk perangkat lunak berskala besar, tidak mungkin mendesainnya dengan sempurna dalam sekali jalan. Setelah program dikompilasi dan dirilis, ketika ditemukan bahwa fungsi tertentu perlu diperbarui, kami tidak dapat meminta pengguna untuk menghapus instalasi perangkat lunak sebelumnya. satu lalu instal ulang versi baru, jika demikian pasti software ini tidak akan digunakan oleh banyak orang. Jika statis, seluruh program perlu dikompilasi ulang satu kali untuk merealisasikan pembaruan fungsi. Jika menggunakan mekanisme refleksi, tidak perlu di-uninstall, hanya perlu dibuat dan dikompilasi secara dinamis saat runtime untuk merealisasikan fungsinya.
Kerugiannya adalah dampaknya terhadap kinerja. Menggunakan refleksi pada dasarnya adalah operasi yang diinterpretasikan di mana kita dapat memberi tahu JVM apa yang ingin kita lakukan dan memenuhi persyaratan kita. Operasi seperti ini selalu lebih lambat dibandingkan hanya melakukan operasi yang sama secara langsung.
4. Informasi apa saja yang dapat diperoleh dengan menggunakan mekanisme refleksi?
Singkatnya bisa mendapatkan informasi apapun yang ada di kelas tersebut, namun prasyaratnya adalah mengetahui nama kelas tersebut, jika tidak maka tidak akan ada informasi lebih lanjut. Pertama, objek Kelas harus dibuat berdasarkan nama lengkap kelas tersebut kelas masuk.
Class c=Class.forName("className"); Catatan: className harus nama lengkap, yaitu harus menyertakan nama paket, misalnya cn.netjava.pojo.UserInfo;
Objek obj=c.newInstance();//Buat sebuah instance dari objek
Oke, setelah Anda memiliki objek, semuanya mudah ditangani. Anda bisa mendapatkan informasi apa pun yang Anda inginkan.
Cara mendapatkan konstruktor
Konstruktor getConstructor(Class[] params)//Dapatkan konstruktor publik sesuai dengan parameter yang ditentukan
Konstruktor[] getConstructors()//Dapatkan semua konstruktor publik
Konstruktor getDeclaredConstructor(Class[] params)//Dapatkan konstruktor publik dan non-publik berdasarkan parameter yang ditentukan
Konstruktor[] getDeclaredConstructors()//Dapatkan semua konstruktor publik
Dapatkan metode metode kelas
Metode getMethod (Nama string, parameter Kelas[]), dapatkan metode berdasarkan nama metode dan tipe parameter
Metode[] getMethods()//Dapatkan semua metode publik
Metode getDeclaredMethod(Nama string, Kelas[] params)//Menurut nama metode dan tipe parameter, dapatkan metode publik dan non-publik
Metode[] getDeclaredMethods()//Dapatkan semua metode publik dan non-publik
Cara mendapatkan atribut di kelas
Bidang getField(Nama string)//Dapatkan variabel publik yang sesuai sesuai dengan nama variabel
Field[] getFields()//Dapatkan semua metode publik di kelas
Bidang getDeclaredField(Nama string)//Dapatkan variabel publik dan non-publik berdasarkan nama metode
Field[] getDeclaredFields()//Dapatkan semua metode publik dan non-publik di kelas
Ini adalah yang umum digunakan. Jika Anda mengetahuinya, segala sesuatunya akan mudah ditangani...
5. Apa yang dapat dilakukan dengan mekanisme refleksi?
Saat pertama kali menggunakan jdbc, saya merasa ingin muntah ketika menulis untuk mengakses database. Ada delapan tabel, dan setiap tabel ada operasi penambahan, penghapusan, modifikasi, dan pencarian mekanisme refleksi, jadi saya menulis tentang Buat kelas DAO yang berbeda di tabel, yang tidak hanya mempercepat pengembangan, tetapi juga membuat kode menjadi mubazir. Hal yang paling buruk adalah tampilannya hampir sama, lalu langsung disalin dan dimodifikasi. karena mudah untuk membuat berbagai kesalahan tingkat rendah (huruf besar dan kecil, satu lagi atau satu huruf hilang...), satu kesalahan bisa memakan waktu lama untuk menemukannya.
Dengan mekanisme refleksi Java, semuanya mudah ditangani. Anda hanya perlu menulis kelas dao dengan empat metode, menambah, menghapus, mengubah, dan menanyakan, serta meneruskan objek yang berbeda kelas dao untuk setiap tabel. Mekanisme refleksi akan secara otomatis melakukan sisanya untuk kita, itulah manfaatnya. Terus terang, mekanisme refleksi dirancang untuk membantu kita melakukan hal-hal yang berulang dan teratur, sehingga banyak perangkat lunak yang secara otomatis menghasilkan kode sekarang menggunakan mekanisme refleksi untuk menyelesaikannya. programmer tingkat lambat Yang lambat dilenyapkan, mengapa? Karena tidak perlu menulis kode, siapa pun bisa mengembangkannya, lalu mengapa programmer melakukannya? Jadi kita hanya punya satu jalan keluar, yaitu bekerja keras dan bekerja lebih keras, menjadi programmer senior, berspesialisasi dalam pengembangan perangkat lunak bodoh, dan membiarkan programmer lain menyingkir dan menenangkan diri, haha~
6. Contoh penggunaan mekanisme refleksi untuk menambah dan memeriksa data database
Prinsip dasar: saat menyimpan data, keluarkan semua nilai atribut dari objek yang perlu disimpan lalu kumpulkan pernyataan SQL untuk kueri, dan kemas semua data yang dikueri ke dalam objek java.
Aturan mainnya: Seperti kata pepatah, tidak ada apa pun tanpa aturan. Khusus untuk program, ia hanya bisa melakukan sesuatu dengan aturan.
1) Setiap objek tabel dalam database memiliki kelas pojo, dan setiap bidang dalam tabel berhubungan dengan atribut dalam kelas pojo. Selain itu, nama kelas pojo sama dengan nama tabel, serta nama atribut dan nama field juga sama.
2) Tambahkan kumpulan standar dan dapatkan metode untuk setiap atribut di kelas pojo.
Dengan aturan mainnya, mari kita mulai bermain.
1. Pertama, ada tabel di database. Asumsikan nama databasenya adalah: blogsystem, dan nama tabel di dalamnya adalah userinfo. Seperti yang ditunjukkan pada gambar:
2. Buat kelas pojo yang sesuai:
Copy kode kodenya sebagai berikut:
paket cn.netjava.pojo;
Info Pengguna kelas publik {
id int pribadi;
nama String pribadi;
String pribadi pwd;
usia swasta;
@Mengesampingkan
String publik keString() {
kembalikan "UserInfo [id=" + id + ", nama=" + nama + ", pwd=" + pwd + ", age="
+ usia + "]";
}
publik int getId() {
mengembalikan identitas;
}
kekosongan publik setId(int id) {
ini.id = id;
}
String publik getName() {
nama kembali;
}
public void setName(Nama string) {
ini.nama = nama;
}
String publik getPwd() {
kembalikan pwd;
}
kekosongan publik setPwd(String pwd) {
ini.pwd = pwd;
}
publik int getUmur() {
usia kembali;
}
public void setAge(int usia) {
this.usia = usia;
}
}
2. Tulis kelas pabrik untuk mendapatkan koneksi database:
Copy kode kodenya sebagai berikut:
paket cn.netjava.factory;
impor java.sql.Koneksi;
impor java.sql.DriverManager;
kelas publik Connect2DBFactory {
Koneksi statis publik getDBConnection() {
Sambungan koneksi = null;
mencoba {
Kelas.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/blogsystem";
String pengguna = "root";
Kata sandi string = "netjava";
samb = DriverManager.getConnection(url, pengguna, kata sandi);
} tangkapan (Pengecualian e) {
e.printStackTrace();
}
koneksi kembali;
}
}
3. Kegembiraan dimulai, menulis kelas dao yang mengoperasikan database
Copy kode kodenya sebagai berikut:
paket cn.netjava.session;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
impor java.sql.Koneksi;
impor java.sql.PreparedStatement;
impor java.sql.ResultSet;
impor java.sql.SQLException;
impor java.sql.Pernyataan;
impor java.util.ArrayList;
impor java.util.List;
impor cn.netjava.factory.Connect2DBFactory;
impor cn.netjava.pojo.UserInfo;
kelas publik NetJavaSession {
/**
* Parsing pernyataan sql yang menyimpan objek
*
* @param objek
* : Objek yang perlu disimpan
* @return: pernyataan sql untuk menyimpan objek
*/
String statis publik getSaveObjectSql(Objek objek) {
//Definisikan string sql
String sql = "masukkan ke dalam ";
// Dapatkan kelas objeknya
Kelas c = objek.getClass();
// Dapatkan semua metode di objek
Metode[] metode = c.getMethods();
// Dapatkan semua properti di objek
Bidang[] bidang = c.getFields();
// Dapatkan nama kelas objek
String cNama = c.getName();
// Parsing nama tabel dari nama kelas
String tableName = cName.substring(cName.lastIndexOf(".") + 1,
cName.panjang());
sql += Nama tabel + "(";
Daftar<String> mList = Daftar Array baru<String>();
Daftar vList = ArrayList baru();
untuk (Metode metode : metode) {
String mNama = metode.getName();
if (mName.startsWith("get") && !mName.startsWith("getClass")) {
String fieldName = mName.substring(3, mName.length());
mList.add(Namabidang);
System.out.println("Nama Bidang----->" + Nama Bidang);
mencoba {
Nilai objek = metode.invoke(objek, null);
System.out.println("Nilai yang dikembalikan oleh metode eksekusi: " + nilai);
if (nilai instanceof String) {
vList.tambahkan("/"" + nilai + "/"");
System.out.println("Nilai bidang ------>" + nilai);
} kalau tidak {
vList.tambahkan(nilai);
}
} tangkapan (Pengecualian e) {
e.printStackTrace();
}
}
}
untuk (int i = 0; i < mList.ukuran(); i++) {
if (i < mList.ukuran() - 1) {
sql += mList.dapatkan(i) + ",";
} kalau tidak {
sql += mList.dapatkan(i) + ") nilai(";
}
}
untuk (int i = 0; i < vList.ukuran(); i++) {
if (i < vList.ukuran() - 1) {
sql += vList.dapatkan(i) + ",";
} kalau tidak {
sql += vList.dapatkan(i) + ")";
}
}
kembalikan sql;
}
Daftar statis publik getDatasFromDB(String tableName, int Id) {
kembalikan nol;
}
/**
* Simpan objek ke database
*
* @param objek
* : Objek yang perlu disimpan
* @return: Hasil eksekusi metode; 1: menunjukkan keberhasilan, 0: menunjukkan kegagalan
*/
public int saveObject(Objek objek) {
Koneksi con = Connect2DBFactory.getDBConnection();
String sql = getSaveObjectSql(objek);
mencoba {
// Pernyataan pernyataan=(Pernyataan) con.createStatement();
PreparedStatement psmt = con.prepareStatement(sql);
psmt.executeUpdate();
kembali 1;
} tangkapan (SQLException e) {
e.printStackTrace();
kembali 0;
}
}
/**
* Dapatkan objek dari database
*
* @param arg0
* : Kelas tempat objek tersebut berada
* @param id
*: id objek
* @return: objek yang akan ditemukan
*/
Objek publik getObject(String className, int Id) {
// Dapatkan nama tabel
String tableName = className.substring(className.lastIndexOf(".") + 1,
className.panjang());
//Membuat objek Kelas berdasarkan nama kelas
Kelas c = nol;
mencoba {
c = Kelas.untukNama(Namakelas);
} tangkapan (ClassNotFoundException e1) {
e1.printStackTrace();
}
// Menyatukan pernyataan query sql
String sql = "pilih * dari " + namatabel + " di mana Id=" + Id;
System.out.println("Temukan pernyataan sql: " + sql);
// Dapatkan tautan basis data
Koneksi con = Connect2DBFactory.getDBConnection();
//Buat sebuah instance dari kelas
Objek objek = null;
mencoba {
Pernyataan stm = con.createStatement();
// Dapatkan kumpulan hasil yang dikembalikan dengan menjalankan pernyataan pencarian
Set Hasil = stm.executeQuery(sql);
// Dapatkan array metode dari objek
Metode[] metode = c.getMethods();
// Lintasi kumpulan hasil
sementara (set.berikutnya()) {
obj = c.newInstance();
//Metode untuk melintasi objek
untuk (Metode metode : metode) {
String metodeNama = metode.getName();
// Jika metode objek dimulai dengan set
if (methodName.startsWith("set")) {
// Mendapatkan nama field pada tabel data berdasarkan nama metode
String nama kolom = nama metode.substring(3,
nama metode.panjang());
// Dapatkan tipe parameter dari metode tersebut
Kelas[] parmts = metode.getParameterTypes();
if (parmts[0] == String.kelas) {
// Jika parameternya bertipe String, dapatkan nilai yang sesuai dari kumpulan hasil sesuai dengan nama kolom, dan jalankan metode set
metode.invoke(obj, set.getString(nama kolom));
}
if (parmts[0] == int.kelas) {
metode.invoke(obj, set.getInt(nama kolom));
}
}
}
}
} tangkapan (Pengecualian e) {
e.printStackTrace();
}
mengembalikan objek;
}
}
4. Bagaimana dengan efek memulai tes:
Copy kode kodenya sebagai berikut:
paket cn.netjava.tester;
impor cn.netjava.pojo.UserInfo;
impor cn.netjava.session.NetJavaSession;
Penguji kelas publik {
public static void main(String args[]) {
//Dapatkan objek NetJavaSession
Sesi NetJavaSession = NetJavaSession baru();
//Buat objek UserInfo
UserInfo pengguna = UserInfo baru();
//Mengatur properti objek
pengguna.setId(6988);
pengguna.setAge(44);
pengguna.setPwd("pwd");
pengguna.setName("juara");
//Simpan objek ke database
String sql = sesi.getSaveObjectSql(pengguna);
System.out.println("Pernyataan SQL untuk menyimpan objek: " + sql);
//Temukan objek
UserInfo userInfo = (UserInfo) sesi.getObject(
"cn.netjava.pojo.UserInfo", 6988);
System.out.println("Informasi yang diperoleh : "+userInfo);
}
}
5. Hasil cetak :
7. Mari kita rangkum
Secara umum, mekanisme refleksi Java adalah hal yang sangat berguna. Dapat menyelesaikan banyak hal yang mati karena mekanisme refleksinya sangat fleksibel, kita tidak perlu menghabiskan terlalu banyak waktu untuk menulis operasi. metode ini menghabiskan lebih banyak waktu pada fungsi logis proyek. Hal ini dapat sangat mengurangi waktu pengembangan dan membuat kode lebih mudah dibaca. Banyak kerangka kerja sumber terbuka yang ada menggunakan mekanisme refleksi. Mereka hanya perlu mengonfigurasi file dan kemudian memanggil metodenya sesuai aturan.