Rumah  >  Artikel  >  Java  >  Prinsip asas dan kaedah panggilan refleksi Java

Prinsip asas dan kaedah panggilan refleksi Java

王林
王林asal
2023-12-23 09:01:071060semak imbas

. Melalui refleksi, kita boleh mencipta objek secara dinamik, kaedah panggilan, dapatkan/tetapkan sifat, dsb. pada masa jalan, yang meningkatkan fleksibiliti dan kebolehskalaan program. Artikel ini akan memperkenalkan prinsip asas refleksi Java dan memberikan contoh kod khusus.

Prinsip asas dan kaedah panggilan refleksi Java1. Prinsip asas refleksi

Pelaksanaan refleksi Java adalah berdasarkan kelas Kelas, yang merupakan kelas teras refleksi Java. Setiap kelas Java akan menjana objek Kelas yang sepadan selepas kompilasi maklumat Kelas boleh diperolehi melalui objek Kelas, dan operasi kelas boleh dilakukan melalui maklumat kelas.

Refleksi Java terutamanya mempunyai kelas teras dan antara muka berikut:


Kelas kelas: mewakili jenis kelas, yang merupakan titik masuk refleksi Java.


Kelas medan: mewakili pembolehubah ahli kelas.

Kelas kaedah: mewakili kaedah ahli kelas.

    Kelas pembina: Mewakili kaedah pembina kelas.
  1. Prinsip asas refleksi Java adalah seperti berikut: Pertama, dapatkan objek Kelas yang sepadan melalui nama kelas yang layak sepenuhnya atau kaedah getClass() objek kemudian, melalui beberapa kaedah kelas Kelas, seperti getFields(), getMethods(), dsb. Dapatkan Medan, Kaedah, Pembina dan objek lain akhirnya, lakukan operasi khusus melalui objek ini, seperti mendapatkan/menetapkan nilai harta, kaedah memanggil, mencipta objek, dsb.
  2. 2. Kaedah panggilan Refleksi
  3. 2.1 Dapatkan objek Kelas
  4. Objek Kelas yang sepadan boleh diperolehi melalui nama kelas yang layak sepenuhnya atau kaedah getClass() objek.
Kod sampel adalah seperti berikut:

// 通过类的全限定名获取Class对象
Class<?> clazz1 = Class.forName("com.example.User");

// 通过对象的getClass()方法获取Class对象
User user = new User();
Class<?> clazz2 = user.getClass();

2.2 Mendapatkan nilai atribut

Nilai atribut objek boleh diperoleh melalui kaedah get() kelas Medan.

Kod sampel adalah seperti berikut:

// 获取public属性值
Field field = clazz.getDeclaredField("name");
String name = (String) field.get(user);

// 获取private属性值
Field privateField = clazz.getDeclaredField("age");
privateField.setAccessible(true); // 设置private属性的访问权限
int age = (int) privateField.get(user);

2.3 Menetapkan nilai atribut

Nilai atribut objek boleh ditetapkan melalui kaedah set() kelas Medan.


Kod sampel adalah seperti berikut:

// 设置public属性值
Field field = clazz.getDeclaredField("name");
field.set(user, "Tom");

// 设置private属性值
Field privateField = clazz.getDeclaredField("age");
privateField.setAccessible(true); // 设置private属性的访问权限
privateField.set(user, 20);

2.4 Kaedah panggilan

Kaedah objek boleh dipanggil melalui kaedah invoke() kelas Kaedah.


Kod sampel adalah seperti berikut:

// 调用无参方法
Method method1 = clazz.getDeclaredMethod("sayHello");
method1.invoke(user);

// 调用带参方法
Method method2 = clazz.getDeclaredMethod("sayHi", String.class);
method2.invoke(user, "Jack");

2.5 Mencipta objek

Objek boleh dibuat melalui kaedah newInstance() kelas Pembina.


Kod sampel adalah seperti berikut:

Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, int.class);
User newUser = (User) constructor.newInstance("Lucy", 25);

Ringkasan:

Refleksi Java ialah ciri berkuasa dalam bahasa Java, yang boleh memperoleh maklumat kelas secara dinamik dan mengendalikan ahli kelas pada masa jalan. Prinsip asas refleksi adalah untuk mendapatkan maklumat kelas melalui kelas Kelas dan melaksanakan operasi khusus melalui Medan, Kaedah, Pembina dan objek lain. Dalam aplikasi sebenar, kami boleh menggunakan mekanisme refleksi untuk merealisasikan pelbagai keperluan dinamik dan meningkatkan fleksibiliti dan skalabiliti program.

Atas ialah kandungan terperinci Prinsip asas dan kaedah panggilan refleksi Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn