Java反射機(jī)制


通過(guò)反射創(chuàng)建一個(gè)對(duì)象(三步)
第一步:獲取類(lèi)的信息
參數(shù):包名+類(lèi)名
Class class = Class.forName("com.javawu.reflect.Demo");
第二步:獲取類(lèi)的構(gòu)造方法
參數(shù):構(gòu)造方法需要傳遞的參數(shù)的Class
Constructor constructor = class.getConstructor(String.class, int.class);
第三步:根據(jù)獲取到的構(gòu)造方法傳遞相應(yīng)的參數(shù)創(chuàng)建對(duì)象
Demo demo = (Demo)constructor.newInstance("張三", 55);

反射機(jī)制是什么

反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),能夠知道這個(gè)類(lèi)的所有屬性和方法,對(duì)于任意一個(gè)對(duì)象,能夠調(diào)用它的任意一個(gè)方法和屬性。
這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱(chēng)為java語(yǔ)言的放射機(jī)制。

反射機(jī)制能做什么

  • 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類(lèi)
  • 在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象
  • 在運(yùn)行時(shí)判斷任意一個(gè)類(lèi)所具有的成員變量和方法
  • 在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法
  • 生成動(dòng)態(tài)代理

獲取類(lèi)的類(lèi)信息

//參數(shù)需要帶上類(lèi)所在的包名
Class class = Class.forName("com.javawu.reflect.Person");

獲取類(lèi)中的所有公有構(gòu)造方法

Constructor[] constructors = class.getConstructors();

獲取類(lèi)中的所有的共有的和私有的構(gòu)造方法

constructors = class.getDeclaredConstructors();

獲取某個(gè)構(gòu)造方法

  • 獲取不帶參的構(gòu)造方法
Constructor constructor = class.getConstructor();
  • 獲取參數(shù)為String和int類(lèi)型的構(gòu)造方法
constructor = class.getConstructor(String.class, int.class);
//傳遞數(shù)組參數(shù)
//Class[] params = {String.class, int.class};
//class.getConstructor(params);
  • 當(dāng)構(gòu)造方法為private時(shí),需要設(shè)置訪(fǎng)問(wèn)權(quán)限
constructor.setAccessible(true);
  • 根據(jù)構(gòu)造方法創(chuàng)建該類(lèi)的對(duì)象
person = (Person)constructor.newInstance("參數(shù)");

獲取構(gòu)造方法名

constructor.getName();

獲取構(gòu)造方法的參數(shù)的Class數(shù)組

Class[] params = constructor.getParemeterTypes();

獲取類(lèi)中的所有public方法(包括父類(lèi)的方法)

Method[] methods = class.getMethods();

獲取類(lèi)中所有的方法(不包括父類(lèi)的方法)

methods = class.getDeclaredMethods();

獲取指定方法名和參數(shù)的方法

//第一個(gè)參數(shù):方法的名字 第二個(gè)參數(shù):方法的參數(shù)的Class
Method method = class.getMethod("eat", null);

調(diào)用方法

Person person = new Person();
//第一個(gè)參數(shù):執(zhí)行方法的對(duì)象 第二個(gè)參數(shù):方法的參數(shù)
method.invoke(person, null);

調(diào)用靜態(tài)方法

method.invoke(null, 參數(shù))

獲取類(lèi)中的所有public屬性

Field[] fields = class.getFields();

獲取類(lèi)中的所有屬性

fields = class.getDeclaredFields();

獲取指定屬性名的屬性

Field field = calss.getField("name");
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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