簡介:通過獲取Java編譯后產(chǎn)生的字節(jié)碼(class格式)文件,使用Java的反射機制從而獲取得到該類的所有屬性幔戏、方法,以達到設(shè)置該類的屬性以及調(diào)用該類的方法的目的。
1.獲取字節(jié)碼文件的3種方式
(1)通過全類名獲取字節(jié)碼對象(在eclipse代碼編寫區(qū)內(nèi)找到類名晃琳,鼠標左鍵點擊該類名,然后右鍵選擇"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對象當中名字叫做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ù)"芝麻"傳入進去
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)造方法實例化一個對象
Object newInstance2 = constructor.newInstance("kittttty","female"); //使用有參構(gòu)造方法實例化一個對象
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