Rumah > Java > javaTutorial > Bagaimana untuk menggunakan refleksi di Jawa

Bagaimana untuk menggunakan refleksi di Jawa

PHPz
Lepaskan: 2023-06-15 20:57:26
asal
1530 orang telah melayarinya

Refleksi ialah salah satu ciri teras bahasa Java Ia menyediakan mekanisme yang membolehkan program memperoleh maklumat kelas secara dinamik, memanggil sifat dan kaedahnya, mencipta kejadian dan tatasusunan, dsb. pada masa jalan.

Menggunakan refleksi boleh menjadikan program lebih fleksibel, tetapi anda juga perlu memberi perhatian kepada kehilangan prestasi dan risiko keselamatan yang disebabkan oleh refleksi. Artikel ini akan memperkenalkan cara menggunakan refleksi dalam Java.

1. Konsep asas pantulan

Dalam Java, objek Kelas mewakili definisi kelas Anda boleh menggunakan kaedah Class.forName() untuk mendapatkan objek Kelas , sebagai contoh:

Class<?> clazz = Class.forName("com.example.SomeClass");
Salin selepas log masuk

Sebagai tambahan kepada kaedah forName(), anda juga boleh menggunakan kaedah getClass() untuk mendapatkan objek Kelas bagi contoh, contohnya:

SomeClass obj = new SomeClass();
Class<?> clazz = obj.getClass();
Salin selepas log masuk

Maklumat kelas boleh diperolehi melalui objek Kelas, contohnya:

  1. Dapatkan nama kelas:
String name = clazz.getName();
Salin selepas log masuk
  1. Dapatkan pengubah suai kelas:
int modifiers = clazz.getModifiers();
Salin selepas log masuk
  1. Dapatkan nama pakej kelas:
Package pkg = clazz.getPackage();
String packageName = pkg.getName();
Salin selepas log masuk
  1. Dapatkan kelas induk kelas:
Class<?> superClass = clazz.getSuperclass();
Salin selepas log masuk
  1. Dapatkan antara muka kelas:
Class<?>[] interfaces = clazz.getInterfaces();
Salin selepas log masuk
  1. Dapatkan kaedah Pembina kelas:
Constructor<?>[] constructors = clazz.getConstructors();  
Salin selepas log masuk
  1. Dapatkan atribut kelas:
Field[] fields = clazz.getDeclaredFields();     
Salin selepas log masuk
  1. Dapatkan kaedah kelas:
Method[] methods = clazz.getDeclaredMethods();   
Salin selepas log masuk

2. Cipta objek semasa runtime

Anda boleh mencipta objek semasa runtime melalui objek Class . Contohnya:

SomeClass obj = (SomeClass) clazz.newInstance();
Salin selepas log masuk

newInstance() kaedah akan memanggil pembina tanpa argumen lalai untuk mencipta objek Jika tiada pembina tanpa parameter akan membuang InstantiationException.

Jika anda ingin memanggil pembina dengan parameter, anda boleh menggunakan objek Pembina, sebagai contoh:

Constructor<SomeClass> constructor = clazz.getConstructor(int.class, String.class);
SomeClass obj = constructor.newInstance(1, "hello");
Salin selepas log masuk

Kaedah getConstructor() lulus dalam senarai jenis parameter, dan newInstance() kaedah lulus dalam senarai nilai parameter.

3. Kaedah panggilan dan atribut semasa masa jalan

Kaedah dan atribut boleh dipanggil semasa masa jalan melalui objek Kelas, contohnya:

// 调用方法
Method method = SomeClass.class.getMethod("doSomething");
method.invoke(obj);

// 访问属性
Field field = SomeClass.class.getDeclaredField("someField");
field.setAccessible(true);
Object value = field.get(obj);
field.set(obj, "new value");
Salin selepas log masuk

Kaedah getMethod() masuk nama kaedah dan senarai jenis Parameter, kaedah invoke() lulus dalam contoh dan senarai nilai parameter.

Kaedah getDeclaredField() boleh mendapatkan sifat persendirian, tetapi sifat persendirian tidak boleh diakses secara lalai dan perlu dibuat boleh diakses menggunakan kaedah setAccessible().

4. Isu prestasi dan keselamatan refleksi

Refleksi mempunyai fleksibiliti yang tinggi, tetapi ia juga membawa isu prestasi dan keselamatan. Menggunakan pantulan mungkin lebih perlahan daripada kod panggilan terus, kerana pantulan perlu mendapatkan maklumat kelas dan atribut kaedah panggilan pada masa jalan, manakala kod panggilan langsung disusun secara statik.

Selain itu, refleksi juga boleh membawa isu keselamatan Refleksi boleh menembusi mekanisme kebenaran akses Java dan mengakses kaedah dan sifat peribadi Oleh itu, anda perlu berhati-hati apabila menggunakan refleksi untuk mengelakkan potensi risiko keselamatan.

5. Kesimpulan

Refleksi adalah salah satu ciri penting bahasa Java, yang boleh membantu atribut kaedah panggilan program dengan lebih fleksibel, tetapi ia juga perlu memberi perhatian kepada prestasi dan isu keselamatan refleksi. Dalam pembangunan sebenar, anda perlu memilih sama ada untuk menggunakan refleksi mengikut keadaan tertentu untuk mengelakkan kehilangan prestasi dan risiko keselamatan yang tidak perlu.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan refleksi di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan