Java-反射機(jī)制

簡介:通過獲取Java編譯后產(chǎn)生的字節(jié)碼(class格式)文件,使用Java的反射機(jī)制從而獲取得到該類的所有屬性、方法,以達(dá)到設(shè)置該類的屬性以及調(diào)用該類的方法的目的。

1.獲取字節(jié)碼文件的3種方式
(1)通過全類名獲取字節(jié)碼對象(在eclipse代碼編寫區(qū)內(nèi)找到類名,鼠標(biāo)左鍵點(diǎn)擊該類名,然后右鍵選擇"Copy Qualified Name")
Class clazz1 = Class.forName("cn.zzo.reflect17.Cat");
(2)通過類.class直接得到
Class clazz2 = Cat.class;
(3)通過該類的對象.getClass()方法獲得
Class clazz3 = new Cat().getClass();
2.獲取屬性的方式
(1)獲取該類以及其父類的所有公共(public)屬性對象
Field[] fields = catClass.getFields();
(2)獲得該類的所有屬性(包括公有和私有)對象,但是不包括父類的任何屬性對象
Field[] declaredFields = catClass.getDeclaredFields();
(3)獲取該類或者父類中名字為sex的一個公共(public)屬性對象,如果兩個類都有則優(yōu)先獲取本類的sex
Field field = catClass.getField("sex");
(4)獲取該類中名字為name的一個屬性對象,無論公有還是私有都可以獲取到
Field declaredfield = catClass.getDeclaredField("name");
(5)要設(shè)置類中的私有變量的值,必須先設(shè)置其權(quán)限,該方式稱為暴力反射
Field nameField = catClass.getDeclaredField("name");
nameField.setAccessible(true);  //暴力反射
nameField.set(cat, "kitty");    //設(shè)置一個屬性的值
Object object = nameField.get(cat);     //獲取cat對象當(dāng)中名字叫做name的屬性的值
3.獲取方法的方式
(1)獲取該類以及其父類的所有公共(public)方法對象
Method[] methods = catClass.getMethods();
(2)獲得該類的所有方法(包括公有和私有)對象,但是不包括父類的任何方法對象
Method[] declaredMethods = catClass.getDeclaredMethods();
(3)獲取該類或者父類中名字為methodName的一個公共(public)屬性對象,如果兩個類都有則優(yōu)先獲取本類的methodName
Method method = catClass.getMethod("methodName");
(4)獲取該類中名字為methodName的一個屬性對象,無論公有還是私有都可以獲取到
Method declaredMethod = catClass.getDeclaredMethod("methodName");
(5)有參和無參方法的獲取
Method eatMethod = catClass.getMethod("eat", String.class);     //獲取該類中一個名字為eat參數(shù)為String類型的方法
Method sleepMethod = catClass.getMethod("sleep");   //獲取該類中一個名字為sleep無參的方法
(6)方法的調(diào)用
eatMethod.invoke(cat, "芝麻");    //調(diào)用cat對象的eat方法,并將String類型的參數(shù)"芝麻"傳入進(jìn)去
sleepMethod.invoke(cat);        //調(diào)用cat對象的sleep方法,不傳任何參數(shù)
(7)獲取與使用構(gòu)造方法
Constructor[] constructors = catClass.getConstructors();    //獲取所有的構(gòu)造方法
Constructor constructor = catClass.getConstructor(String.class,String.class);   //獲取有參構(gòu)造方法
Object newInstance1 = constructor.newInstance();    //使用無參構(gòu)造方法實(shí)例化一個對象
Object newInstance2 = constructor.newInstance("kittttty","female");     //使用有參構(gòu)造方法實(shí)例化一個對象
Object cat2 = catClass.getConstructor(String.class,String.class).newInstance("kitttty","female");   //也可以像這樣一步完成
4.獲取變量的修飾符
int modifiers = field.getModifiers();
1表示public,2表示private,4表示protected,8表示static,10表示final
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容