2019-05-22 13:46:49 3136瀏覽
今天千鋒扣丁學(xué)堂Java培訓(xùn)老師給大家介紹一下關(guān)于Java中反射機(jī)制的詳細(xì)介紹,下面我們一起來看一下吧。
學(xué)習(xí)一個(gè)知識(shí),自然是最先從api開始,反射涉及的類,除了Class類之外,基本上都在java.lang.reflect包里面,常用的類有Constructor,F(xiàn)ield,Method類等,AccessibleObject類是前面三個(gè)類的基類,主要包含設(shè)置安全性檢查等方法,下面,我們看一下reflect包的結(jié)構(gòu)。
package com.qf.cdxt;public class Person { //私有屬性private String name = "AME"; //公有屬性public int age = 18; //構(gòu)造方法public Person() { } //私有方法private void eat(){ System.out.println("private eat()..."); } //公有方法public void play(){ System.out.println("public play()..."); } }
//1、通過對(duì)象調(diào)用 getClass() 方法來獲取,通常應(yīng)用在:比如你傳過來一個(gè) Object// 類型的對(duì)象,而我不知道你具體是什么類,用這種方法 Person person1= new Person(); Class c1 = person1.getClass(); //2、直接通過 類名.class 的方式得到,該方法最為安全可靠,程序性能更高// 這說明任何一個(gè)類都有一個(gè)隱含的靜態(tài)成員變量 class Class c2 = Person.class; //3、通過 Class 對(duì)象的 forName() 靜態(tài)方法來獲取,用的最多,// 但可能拋出 ClassNotFoundException 異常
String className = c2.getName(); System.out.println(className);//輸出com.qf.cdxt.Person//獲得類的public類型的屬性。 Field[] fields = c2.getFields();for(Field field : fields){ System.out.println(field.getName());//age } //獲得類的所有屬性。包括私有的 Field [] allFields = c2.getDeclaredFields();for(Field field : allFields){ System.out.println(field.getName());//name age } //獲得類的public類型的方法。這里包括 Object 類的一些方法 Method [] methods = c2.getMethods();for(Method method : methods){ System.out.println(method.getName());//play waid equls toString hashCode等 } //獲得類的所有方法。 Method [] allMethods = c2.getDeclaredMethods();for(Method method : allMethods){ System.out.println(method.getName());//play eat } //獲得指定的屬性 Field f1 = c2.getField("age"); System.out.println(f1);//獲得指定的私有屬性 Field f2 = c2.getDeclaredField("name");//啟用和禁用訪問安全檢查的開關(guān),值為 true,則表示反射的對(duì)象在使用時(shí)應(yīng)該取消 java 語言的訪問檢查;反之不取消 f2.setAccessible(true); System.out.println(f2); //創(chuàng)建這個(gè)類的一個(gè)對(duì)象Object p2 = c2.newInstance();//將 p2 對(duì)象的 f2 屬性賦值為 Fy,f2 屬性即為 私有屬性 name f2.set(p2,"Fy");//使用反射機(jī)制可以打破封裝性,導(dǎo)致了java對(duì)象的屬性不安全。 System.out.println(f2.get(p2)); //Fy//獲取構(gòu)造方法 Constructor [] constructors = c2.getConstructors();for(Constructor constructor : constructors){ System.out.println(constructor.toString());//public com.ys.reflex.Person() }
【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】 【掃碼進(jìn)入Python全棧開發(fā)免費(fèi)公開課】
查看更多關(guān)于“Java開發(fā)資訊”的相關(guān)文章>>