本文由java編程入門欄目為大家詳細(xì)介紹java中的反射機(jī)制,希望可以幫助到對于此機(jī)制有所不懂的同學(xué)。
java反射
機(jī)制是運(yùn)行狀態(tài)中,對于任意一個類都能夠知道這個類的所有屬性和方法(包括私有的);對于任意一個對象,都能調(diào)用他的任意方法和屬性;這種動態(tài)獲取信息及動態(tài)調(diào)用對象方法的功能稱為Java的反射機(jī)制。
用途:
在運(yùn)行時判斷任意一個對象所屬的類。
在運(yùn)行時構(gòu)造任意一個類的對象。
在運(yùn)行時判斷任意一個類所具有的成員變量和方法。
在運(yùn)行時調(diào)用任意一個對象的方法。
生成動態(tài)代理。
反射相關(guān)的類
class類
在Java程序中獲得Class對象通常有如下三種方式:
1.使用Class類的forName(String clazzName)靜態(tài)方法。該方法需要傳入字符串參數(shù),該字符串參數(shù)的值是某個類的全限定名(必須添加完整包名)。
2.調(diào)用某個類的class屬性來獲取該類對應(yīng)的Class對象。
3.調(diào)用某個對象的getClass()方法。該方法是java.lang.Object類中的一個方法。
Field
Field[] allFields = class2.getDeclaredFields();//獲取class對象的所有屬性 Field[] publicFields = class2.getFields();//獲取class對象的public屬性 Field ageField = class2.getDeclaredField("age");//獲取class指定屬性,可以獲得私有屬性 Field desField = class2.getField("des");//獲取class指定的public屬性
Method
Method[] methods = class2.getDeclaredMethods();//獲取class對象的所有聲明方法 Method[] allMethods = class2.getMethods();//獲取class對象的所有public方法 包括父類的方法 Method method = class2.getMethod("info", String.class);//返回次Class對象對應(yīng)類的、帶指定形參列表的public方法 Method declaredMethod = class2.getDeclaredMethod("info", String.class);//返回次Class對象對應(yīng)類的、 帶指定形參列表的方法
Constructor
Constructor<?>[] allConstructors = class2.getDeclaredConstructors();//獲取class對象的所有聲明構(gòu)造函數(shù) Constructor<?>[] publicConstructors = class2.getConstructors();//獲取class對象public構(gòu)造函數(shù) Constructor<?> constructor = class2.getDeclaredConstructor(String.class);//獲取指定聲明構(gòu)造函數(shù) Constructor publicConstructor = class2.getConstructor(String.class);//獲取指定聲明的public構(gòu)造函數(shù)
通過反射 生成實(shí)例對象
1.使用Class對象的newInstance()方法來創(chuàng)建該Class對象對應(yīng)類的實(shí)例。這種方式要求該Class對象的對應(yīng)類有默認(rèn)構(gòu)造器,而執(zhí)行newInstance()方法時實(shí)際上是利用默認(rèn)構(gòu)造器來創(chuàng)建該類的實(shí)例。
2.先使用Class對象獲取指定的Constructor對象,再調(diào)用Constructor對象的newInstance()方法來創(chuàng)建該Class對象對應(yīng)類的實(shí)例。通過這種方式可以選擇使用指定的構(gòu)造器來創(chuàng)建實(shí)例。
調(diào)用方法
1.通過Class對象的getMethods()方法或者getMethod()方法獲得指定方法,返回Method數(shù)組或?qū)ο蟆?/p>
2.調(diào)用Method對象中的Object invoke(Object obj, Object… args)方法。第一個參數(shù)對應(yīng)調(diào)用該方法的實(shí)例對象,第二個參數(shù)對應(yīng)該方法的參數(shù)。
實(shí)例代碼:
反射是什么?
package am; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import javax.activation.FileDataSource; /** * 反射是什么: * java中的反射:就是在類的加載過程中,發(fā)現(xiàn)類的屬性和方法構(gòu)造方法等信息??梢垣@得類的屬性值,可以調(diào)用類的方法。 * * * 反射獲得類的對象。 * */ public class Demo01 { public static void main(String[] args) throws Exception{ // 通過反射,獲取類的對象。 Object obj = create("am.Foo");; Foo foo = (Foo)obj; System.out.println(foo.a); double dou = foo.show(12, "hello"); System.out.println(dou); System.out.println("======================================"); // 獲得類的屬性 showField(obj); System.out.println("======================================"); double a = (double)getFieldValue(obj, "b"); System.out.println(a); System.out.println("========================================"); // 通過反射調(diào)用方法。 Object ob = getMethodValue(obj,"show",new Class[]{int.class,String.class},new Object[]{23,"abc"}); double douValue = (double)ob; System.out.println(douValue); } //通過反射調(diào)用方法,哪個對象,什么名稱,參數(shù)類型,參數(shù)值 public static Object getMethodValue(Object obj,String method,Class[] paramType,Object[] param) throws Exception{ Class cla = obj.getClass(); Method me = cla.getDeclaredMethod(method, paramType); Object o = me.invoke(obj, param); return o; } // 獲取類的屬性值: public static Object getFieldValue(Object obj,String name)throws Exception{ Class cla = obj.getClass();// 獲取字節(jié)碼對象。 Field field = cla.getDeclaredField(name);// 通過屬性的名稱。獲取當(dāng)前屬性。 Object result = field.get(obj); return result; } // 通過反射,可以獲得類的屬性信息以及方法信息。 public static void showField(Object obj){ // java中對屬性類。 Field 方法類:Method Class cla = obj.getClass(); System.out.println("獲取類名:"+cla.getName()); System.out.println("======================================"); // 獲取類的屬性: Field[] fields = cla.getDeclaredFields();// 獲取公開的屬性。 for(Field field : fields){ System.out.println("獲取類的屬性類型"+field.getType()); System.out.println("獲取類的屬性名稱:"+field.getName()); } System.out.println("======================================"); // 獲取類的方法。 Method[] methods = cla.getDeclaredMethods(); for(Method method : methods){ System.out.println("獲取方法的返回值類型:"+method.getReturnType()); System.out.println("獲取方法名稱:"+method.getName()); System.out.println("獲取方法的參數(shù)類型。"+Arrays.toString(method.getParameterTypes())); } System.out.println("======================================="); // 獲取類的構(gòu)造方法: Constructor[] cons = cla.getDeclaredConstructors(); for(Constructor con : cons){ System.out.println("構(gòu)造方法的名字:"+con.getName()); System.out.println("構(gòu)造方法參數(shù)類型:"+Arrays.toString(con.getParameterTypes())); } } // 如何反射類的實(shí)例。 public static Object create(String name) throws Exception{ // 反射的方法。Class.forName(); Class cla = Class.forName(name); // 如何獲得Object類型對象。 Object obj = cla.newInstance(); return obj; } } // 模擬類。 class Foo{ int a = 10; double b = 20; public double show(int p,String str){ System.out.println("調(diào)用方法傳入的值是:"+str); return a+b+p; } public Foo(){ } public Foo(int a,int b){ } }
更多相關(guān)學(xué)習(xí)視頻推薦:java視頻教程
Atas ialah kandungan terperinci 對于java反射機(jī)制的詳細(xì)介紹. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Untuk mengendalikan transaksi JDBC dengan betul, anda mesti terlebih dahulu mematikan mod komit automatik, kemudian melakukan pelbagai operasi, dan akhirnya melakukan atau mengembalikan semula hasilnya; 1. Panggil Conn.SetAutOcommit (palsu) untuk memulakan transaksi; 2. Melaksanakan pelbagai operasi SQL, seperti memasukkan dan mengemaskini; 3. Panggil Conn.Commit () jika semua operasi berjaya, dan hubungi conn.rollback () jika pengecualian berlaku untuk memastikan konsistensi data; Pada masa yang sama, cuba-dengan-sumber harus digunakan untuk menguruskan sumber, mengendalikan pengecualian dengan betul dan menutup sambungan untuk mengelakkan kebocoran sambungan; Di samping itu, adalah disyorkan untuk menggunakan kolam sambungan dan menetapkan mata simpan untuk mencapai rollback separa, dan menyimpan urus niaga sesingkat mungkin untuk meningkatkan prestasi.

Gunakan kelas dalam pakej Java.Time untuk menggantikan kelas lama dan kelas kalendar; 2. Dapatkan tarikh dan masa semasa melalui LocalDate, LocalDateTime dan Tempatan Tempatan; 3. Buat tarikh dan masa tertentu menggunakan kaedah (); 4. Gunakan kaedah tambah/tolak untuk meningkatkan dan mengurangkan masa; 5. Gunakan zoneddatetime dan zonid untuk memproses zon waktu; 6. Format dan parse date string melalui DateTimeFormatter; 7. Gunakan segera untuk bersesuaian dengan jenis tarikh lama apabila perlu; pemprosesan tarikh di java moden harus memberi keutamaan untuk menggunakan java.timeapi, yang memberikan jelas, tidak berubah dan linear

Pra-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless scenarios.tyvelopecosyste,

Koleksi Sampah Java (GC) adalah mekanisme yang secara automatik menguruskan ingatan, yang mengurangkan risiko kebocoran ingatan dengan menuntut semula objek yang tidak dapat dicapai. 1.GC menghakimi kebolehcapaian objek dari objek akar (seperti pembolehubah stack, benang aktif, medan statik, dan lain -lain), dan objek yang tidak dapat dicapai ditandakan sebagai sampah. 2. Berdasarkan algoritma penandaan tanda, tandakan semua objek yang dapat dicapai dan objek yang tidak ditandai. 3. Mengamalkan strategi pengumpulan generasi: Generasi Baru (Eden, S0, S1) sering melaksanakan MinorGC; Orang tua melakukan kurang tetapi mengambil masa lebih lama untuk melakukan MajorGC; Metaspace Stores Metadata kelas. 4. JVM menyediakan pelbagai peranti GC: SerialGC sesuai untuk aplikasi kecil; ParallelGC meningkatkan throughput; CMS mengurangkan

HTTP Log Middleware di GO boleh merakam kaedah permintaan, laluan, IP klien dan memakan masa. 1. Gunakan http.handlerfunc untuk membungkus pemproses, 2. Rekod waktu mula dan masa akhir sebelum dan selepas memanggil next.servehttp, 3. Dapatkan IP pelanggan sebenar melalui r.remoteaddr dan X-forward-for headers, 4. Gunakan log.printf untuk mengeluarkan log permintaan, 5. Kod sampel lengkap telah disahkan untuk dijalankan dan sesuai untuk memulakan projek kecil dan sederhana. Cadangan lanjutan termasuk menangkap kod status, menyokong log JSON dan meminta penjejakan ID.

Memilih jenis htmlinput yang betul dapat meningkatkan ketepatan data, meningkatkan pengalaman pengguna, dan meningkatkan kebolehgunaan. 1. Pilih jenis input yang sepadan mengikut jenis data, seperti teks, e -mel, tel, nombor dan tarikh, yang secara automatik boleh menyemak dan menyesuaikan diri dengan papan kekunci; 2. Gunakan HTML5 untuk menambah jenis baru seperti URL, Warna, Julat dan Carian, yang dapat memberikan kaedah interaksi yang lebih intuitif; 3. Gunakan pemegang tempat dan sifat -sifat yang diperlukan untuk meningkatkan kecekapan dan ketepatan pengisian bentuk, tetapi harus diperhatikan bahawa pemegang tempat tidak dapat menggantikan label.

GradleisthebetterChoiceFormostNewProjectSduetoitSsuperiorflexibility, Prestasi, danModernToolingSupport.1.Gradle'sGroovy/KOT lindslismoreconciseandexpressivethanmaven'sverbosexml.2.GradleOutPerformsMaveninBuildSpeedWithIncrementalcompilation, BuildCac

Defer digunakan untuk melaksanakan operasi tertentu sebelum fungsi pulangan, seperti sumber pembersihan; Parameter dinilai dengan serta-merta apabila menangguhkan, dan fungsi-fungsi dilaksanakan mengikut urutan terakhir (LIFO); 1. Pelbagai penahanan dilaksanakan dalam urutan terbalik pengisytiharan; 2. Biasanya digunakan untuk pembersihan yang selamat seperti penutupan fail; 3. Nilai pulangan yang dinamakan boleh diubah suai; 4. Ia akan dilaksanakan walaupun panik berlaku, sesuai untuk pemulihan; 5. Elakkan penyalahgunaan menangguhkan gelung untuk mengelakkan kebocoran sumber; Penggunaan yang betul boleh meningkatkan keselamatan kod dan kebolehbacaan.
