Java的反射機(jī)制一起來(lái)看看
一、什么是反射機(jī)制?
反射就是運(yùn)行時(shí)識(shí)別類(lèi)的能力,在運(yùn)行時(shí)可以獲得當(dāng)前對(duì)象的類(lèi)結(jié)構(gòu),動(dòng)態(tài)創(chuàng)建類(lèi)的實(shí)例,調(diào)用對(duì)象的方法等;
獲得Class類(lèi)對(duì)象的三種方式:
方式一 :Class.forName(“類(lèi)名”);
Class類(lèi)的一個(gè)靜態(tài)方法forName 加載類(lèi)獲得類(lèi)對(duì)象 運(yùn)行的類(lèi)庫(kù)中沒(méi)有Person類(lèi),程序依然可以編譯。
Class cls = Class.forName("com.oracle.vo.Person");
方式二: 類(lèi)名.class
要求運(yùn)行的類(lèi)庫(kù)一定要有Person類(lèi)
//編譯的字節(jié)碼文件中,會(huì)為每個(gè)類(lèi) 定義一個(gè)靜態(tài)的屬性class 類(lèi)型是Class類(lèi)型 //會(huì)為每個(gè)類(lèi)定義一個(gè)屬性,存儲(chǔ)自己類(lèi)的類(lèi)對(duì)象 Class cls = Person.class;
方式三: 對(duì)象.getClass()
要求運(yùn)行的類(lèi)庫(kù)中一定要有Person類(lèi) 當(dāng)持有了一個(gè)對(duì)象時(shí),可以根據(jù)對(duì)象獲得其類(lèi)對(duì)象
Person p = new Person(); //getClass方法是Object類(lèi)的方法,所有的對(duì)象都有g(shù)etClass方法 Class cls = p.getClass();
二、Class類(lèi)
API方法
1. getName()
獲得類(lèi)對(duì)象對(duì)應(yīng)類(lèi)的類(lèi)名(全類(lèi)名:包名+類(lèi)名)
2. getSimpleName()
獲得類(lèi)對(duì)象對(duì)應(yīng)類(lèi)的類(lèi)名
3. getPackage()
獲得類(lèi)對(duì)象對(duì)應(yīng)類(lèi)的包對(duì)象
try { Class cls = Class.forName("com.oracle.vo.Person"); System.out.println(cls.getName()); System.out.println(cls.getSimpleName()); Package page = cls.getPackage(); System.out.println(page.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); }
4. getField(String name)
根據(jù)名字獲得能訪問(wèn)的屬性。
5. getDeclaredField(String name)
根據(jù)名字獲得屬性。
6. getDeclaredFields()
獲得所有的屬性
7. getDeclaredMethod()
8. getDeclaredConstructor(Class... types)
根據(jù)參數(shù)列表獲得構(gòu)造器
9. newInstance()
通過(guò)無(wú)參構(gòu)造器創(chuàng)建對(duì)象
10. getSuperClass()
獲得父類(lèi)的類(lèi)對(duì)象
三、Package類(lèi)
Package對(duì)象抽象為包
四、Field類(lèi)
是屬性的抽象,F(xiàn)ield類(lèi)的實(shí)例就是某個(gè)屬性,F(xiàn)ield類(lèi)包括了屬性名、屬性類(lèi)型、屬性值、修飾范圍等。
獲得屬性對(duì)象,主要的作用是對(duì)屬性進(jìn)行賦值或取值的操作。
1. get(Object obj) 返回Object
:獲得某個(gè)對(duì)象的屬性值。
2. setAccessible(boolean flag)
: 設(shè)置屬性是否可訪問(wèn)。
3. set(Object obj,Object value)
: 設(shè)置屬性值
public static void main(String[] args) { //獲得Person的類(lèi)對(duì)象 ,獲得Person的Class對(duì)象 Person p = new Person(); p.setName("tom"); try { Class cls = Class.forName("com.oracle.vo.Person"); //獲得Person類(lèi)中所有的屬性 Field[] fields = cls.getFields(); //獲得Person類(lèi)中的name屬性 Field field = cls.getDeclaredField("name"); System.out.println(field.getName()); //獲得 某個(gè)Person對(duì)象 的name屬性值 //field: Person類(lèi)的name屬性 //設(shè)置這個(gè)屬性可訪問(wèn),忽略修飾范圍 field.setAccessible(true); //設(shè)置p對(duì)象的name屬性值 為jack field.set(p, "jack"); System.out.println(field.get(p)); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }
五、Method類(lèi)
invoke(Object obj, Object ... args) 返回Object : 執(zhí)行method方法
public static void main(String[] args) { //獲得Person的類(lèi)對(duì)象 ,獲得Person的Class對(duì)象 Person p = new Person(); p.setName("tom"); try { Class cls = Class.forName("com.oracle.vo.Person"); //獲得Person類(lèi)的 method(String name) 方法對(duì)象 Method method1 = cls.getDeclaredMethod("method", String.class); //獲得Person類(lèi)的 method() 方法對(duì)象 Method method2 = cls.getDeclaredMethod("method"); //method(int i,String name) 方法對(duì)象 Method method3 = cls.getDeclaredMethod("method",int.class,String.class); //獲得全部方法 Method[] methods = cls.getDeclaredMethods(); //獲得方法要作什么? 就是要調(diào)用方法 //obj參數(shù): 調(diào)用哪個(gè)對(duì)象的方法 method1.invoke(p, "abc"); System.out.println(method3.invoke(p, 10,"abcd")); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
六、Constructor類(lèi)
newInstance(Object ... args) 調(diào)用構(gòu)造器創(chuàng)建對(duì)象
public static void main(String[] args) { //獲得Person的類(lèi)對(duì)象 ,獲得Person的Class對(duì)象 Person p = new Person(); p.setName("tom"); try { Class cls = Class.forName("com.oracle.vo.Person"); //獲得 public Person() 構(gòu)造器 Constructor constructor1 = cls.getDeclaredConstructor(); //public Person(String name, int age) 構(gòu)造器 Constructor constructor2 = cls.getDeclaredConstructor(String.class,int.class); //獲得構(gòu)造器的作用,要調(diào)用構(gòu)造器創(chuàng)建對(duì)象 Object obj1 = constructor1.newInstance(); Object obj2 = constructor2.newInstance("tom",20); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
springboot2版本無(wú)法加載靜態(tài)資源問(wèn)題解決
這篇文章主要介紹了springboot2版本無(wú)法加載靜態(tài)資源問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Jmeter配置代理實(shí)現(xiàn)錄制過(guò)程圖解
這篇文章主要介紹了Jmeter配置代理實(shí)現(xiàn)錄制過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Spark MLlib隨機(jī)梯度下降法概述與實(shí)例
這篇文章主要為大家詳細(xì)介紹了Spark MLlib隨機(jī)梯度下降法概述與實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08elasticsearch啟動(dòng)警告無(wú)法鎖定JVM內(nèi)存
今天小編就為大家分享一篇關(guān)于elasticsearch啟動(dòng)警告無(wú)法鎖定JVM內(nèi)存,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03Java讀取網(wǎng)絡(luò)文件的實(shí)例代碼
這篇文章主要介紹了Java讀取網(wǎng)絡(luò)文件的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Java內(nèi)存模型與JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的區(qū)別詳解
這篇文章主要介紹了Java內(nèi)存模型與JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10Java Spring處理循環(huán)依賴(lài)詳解
這篇文章主要介紹了Java中的Spring如何處理循環(huán)依賴(lài),依賴(lài)指的是Bean與Bean之間的依賴(lài)關(guān)系,關(guān)于更多Spring?處理循環(huán)依賴(lài)的詳情,需要的朋友可以參考下面文章具體內(nèi)容2023-04-04