Kata pengantar:
Baru -baru ini, perusahaan sedang menjalani proses komponen bisnis, dan implementasi perutean menggunakan mekanisme refleksi Java. Karena digunakan, saya ingin belajar dan merangkumnya dengan hati -hati. Bahkan, apakah itu versi Eventbus 2.x sebelumnya, retrofit, atau kerangka anotasi tampilan awal, ia menggunakan mekanisme refleksi Java ke tingkat yang lebih besar atau lebih kecil.
Apa mekanisme refleksi Java?
Mekanisme refleksi Java adalah bahwa dalam keadaan berjalan, untuk kelas mana pun, Anda dapat mengetahui semua sifat dan metode kelas ini; Untuk objek apa pun, Anda dapat memanggil metode apa pun yang diperoleh secara dinamis dan secara dinamis memanggil metode objek disebut mekanisme refleksi Java.
Fungsi apa yang disediakan mekanisme refleksi?
Kelas Mekanisme Refleksi Java:
java.lang.class; // kelas java.lang.reflect.constructor; // metode konstruktor java.lang.reflect.field; // variabel anggota kelas java.lang.reflect.method; // metode kelas java.lang.reflect.modifier; // Akses izin
Implementasi Mekanisme Refleksi Java:
1.) Mendapatkan Objek Kelas
// Metode pertama adalah menggunakan objek getsclass metode orang orang = orang baru (); class <?> Class1 = person.getClass (); // Metode kedua adalah menggunakan atribut kelas kelas1 = person.class; coba {// metode ketiga adalah; comname ("com.wheflect (" comname ("comname (" comname ("comname (" comname ("comname (" coM.fornlect ("coM. Catch (ClassNotFoundException E) {E.PrintStackTrace ();}2.) Dapatkan informasi ringkasan dari objek kelas
boolean isPrimitive = class1.isprimitive (); // menilai apakah itu tipe dasar boolean isarray = class1.isArray (); // menilai apakah itu kelas koleksi boolean isannotation = class1.isannotation (); // judge apakah itu class oolean iis (class1. class1.isenum (); // menilai apakah itu adalah kelas enum boolean isanonymousclass = class1.isanonymousclass (); // menilai apakah itu class name = classname class name = class name = classname (classneted); Berisi paket nama paket Paket Apackage = class1.getPackage (); // Dapatkan informasi Paket Kelas String SimpleName = class1.getsimplename (); // Dapatkan class name class name modifiers = class1.getModifiers (); // dapatkan kelas akses kelas <?> [] classclasses = class1.getdeclared = class class () <) classclass (class1.getdeclared = classclass () classclass () classclass (class1. class1.getDeclaringClass (); // Kelas Eksternal
3.) Dapatkan atribut, metode, konstruktor, dll. Dari objek kelas
Bidang [] allFields = class1.getDeclaredFields (); // Dapatkan semua atribut bidang objek kelas [] publicFields = class1.getFields (); // Dapatkan atribut publik dari objek kelas coba {field agefield = class1.getDeclaredfield ("usia"); // Dapatkan atribut field {get dari class1. Atribut kelas} catch (nosuchfieldException e) {e.printstacktrace ();} Metode [] Metode = class1.getDeclaredMethods (); // Dapatkan semua metode deklarasi dari metode objek Kelas (] allMethods = class1.getMethods ();//Dapatkan semua metode objek Kelas (] Metode (class1.getmethods ();//Dapatkan semua metode objek Kelas (] Metode (class1.getmethods ();//Dapatkan semua metode objek kelas (] Metode (class1. Class1. Parent Class of Class Object Class <?> [] InterfaceClasses = class1.getInterfaces (); // Dapatkan semua antarmuka Konstruktor Objek Kelas <?> [] AllConstructors = class1.getDeclaredConstructors (); // dapatkan semua konstruktor class (?> [] publicconstructors (); get {class1. constructor = class1.getDeclaredConstructor(new Class[]{String.class});//Get the specified declaration constructor publicConstructor = class1.getConstructor(new Class[]{});//Get the specified declaration public constructor} catch (NoSuchMethodException e) { e.printStackTrace();}Annotation[] annotations = class1.getAnnotations (); // Dapatkan semua anotasi dari objek kelas anotasi anotasi = class1.getAnnotation (usang.class); // Dapatkan anotasi yang ditentukan dari objek kelas jenis genericSuperclass = class1.getGenerSupersclass (); // Dapatkan Typetype [] interfacetypes = class1 (); objek kelas 4.) Generasi Dinamis Objek Kelas
// Metode pertama objek kelas memanggil metode newInstance () untuk menghasilkan objek obj = class1.newInstance (); // Metode kedua objek memperoleh objek konstruktor yang sesuai, dan kemudian menghasilkan konstruktor <?> Konstruktor = Class1.getdeclaredConstructor (Kelas baru [] {string.class});/Kelas. Objek [] {"lcj"});5.) Fungsi panggilan dinamis
Coba {// Hasilkan Objek Baru: Gunakan Metode NewInstance () Objek OBJ = Class1.NewInstance (); // menilai apakah objek itu adalah subclass dari orang boolean isinstanceof = obj instance dari orang; // Pertama -tama, Anda perlu mendapatkan metode yang sesuai dengan metode metode metode metode = class1.getDeclaredMethod ("setage", kelas baru [] {int.class}); // Panggil fungsi yang ditentukan dan lulus metode parameter.invoke (OBJ, 28); metode = class1.getDeclaredMethod ("getage"); Objek Hasil = method.invoke (obj, kelas baru [] {});} catch (instantiationException e) {e.printstacktrace ();} catch (IllegalAccessException e) {e.printStackTrace ();} catch (nosuchmethodException E) {e.printScackRace (); e.printstacktrace ();} 6.) Dapatkan tipe generik melalui mekanisme refleksi
Misalnya, struktur berikut
// People Class Public Class People <t> {} // Kelas orang mewarisi orang kelas orang Public Class Person <T> memperluas orang <string> mengimplementasikan PersonInterface <Integer> {} // Antarmuka PersonInterface Antarmuka Publik PersonInterface <T> {}Dapatkan tipe generik
Orang <string> orang = orang baru <> (); // Cara pertama adalah menggunakan objek getSclass class <?> Class1 = person.getClass (); Type genericSuperclass = class1.getGenericSuperclass (); // Dapatkan tipeType [] interfacetypes = class1.getGenericInterfaces (); // Dapatkan typeset dari semua antarmuka objek kelas getComponentType (genericSuperclass); getComponentType (Interfacetypes [0]);
Implementasi GetComponentType
kelas pribadi <?> getComponentType (type type) {class <?> componentType = null; if (type instanceof parameterizedType) {// getActualTypeARGUMP () Mengembalikan array objek jenis yang mewakili parameter jenis aktual dari jenis ini. Type [] aktualpearguments = ((parameterizedType) type) .getActualTypeARGUMS (); if (AcctualTyPeARGUMS! = NULL && AcctualTyPeARGUMS.Length> 0) {componentType = (class <?>) ActualTyPeARGUMS [0]; }} lain jika (type instance dari genericArrayType) {// tipe array yang mewakili tipe elemen yang merupakan tipe parameter atau tipe variabel componentType = (class <?>) ((genericarrayType) type) .getGenericComponentType ();} else {componentType = (class <?>) Tipe;}} component {componentype = (class <?>) 6.) Dapatkan informasi anotasi melalui mekanisme refleksi
Di sini kami fokus untuk mendapatkan informasi anotasi dari metode ini sebagai contoh
Coba {// Pertama -tama, Anda perlu mendapatkan objek metode yang sesuai dengan metode metode metode ini = class1.getDecLaredMethod ("jumptogoodsdetail", kelas baru [] {string.class, string.class}); Anotasi [] annotations1 = method.getAnnotations (); // Dapatkan semua metode anotasi informasi anotasi anotasi1 = method.getAnnotation (routeruri.class); // Dapatkan informasi anotasi yang ditentukan Typevariable [] typevariables1 = method.getTypeParameters (); Anotasi [] [] parameterAnnotationsArray = Method.getParameterAnnotations (); // Dapatkan semua Parameter Annotations Informasi Kelas <?> [] ParameterTypes = Method.getParametertypes (); // Dapatkan semua Parameter Tipe Kelas [] GenericPareTyPes = Method.getGenericParameTypes (); method.getReturnType (); // Dapatkan tipe pengembalian dari Metode Int Modifiers = method.getModifiers (); // Dapatkan izin akses dari metode} catch (nosuchmethodeException e) {e.printstacktrace ();}Skenario aplikasi mekanisme refleksi:
Keuntungan dan Kerugian Mekanisme Refleksi:
Keuntungan: Penilaian jenis runtime, pemuatan kelas dinamis, dan refleksi penggunaan proxy dinamis.
Kekurangan: Kinerja adalah masalah. Refleksi setara dengan serangkaian operasi penjelasan. Memberi tahu JVM tentang apa yang harus dilakukan, kinerja jauh lebih lambat daripada kode Java langsung.
Meringkaskan:
Mekanisme refleksi Java jarang digunakan dalam pengembangan bisnis sehari -hari, tetapi banyak digunakan dalam pembangunan beberapa kerangka kerja dasar. Hari ini saya merangkum dan mempelajarinya secara singkat, dan masih ada banyak pengetahuan yang tidak diketahui untuk digunakan nanti untuk melengkapi itu.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.