您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Java中的反射機(jī)制是什么意思的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
今天我們就來講講java的反射機(jī)制。
當(dāng)程序主動(dòng)使用某個(gè)類的時(shí)候,如果該類還沒有被加載到內(nèi)存中,則系統(tǒng)會(huì)通過加載、連接、初始化這三個(gè)步驟對(duì)該類進(jìn)行初始化,有時(shí)候會(huì)把這一整個(gè)流程叫做類加載器或類初始化
類加載時(shí)值將類文件讀入到內(nèi)存中,并且為該類創(chuàng)建一個(gè)對(duì)象、之后可以直接通過對(duì)象來調(diào)用類及其實(shí)現(xiàn)的父類方法和屬性
一、反射機(jī)制到底是什么:類是由一組對(duì)象(擁有著共同屬性)來組成的,而類與類之間也有共同的屬性、構(gòu)造方法、方法等結(jié)構(gòu),用來描述類的特性,即可以調(diào)用或查看某個(gè)類的屬性、方法、即構(gòu)造方法就叫做反射。
二、java反射機(jī)制的好處:
1.極大的提高了應(yīng)用程序的擴(kuò)展性,之前都是通過多來將子類對(duì)象傳遞給父類應(yīng)用來實(shí)現(xiàn)的,大大的增加了代碼的耦合性,并且無法訪問真實(shí)對(duì)象的信息,這個(gè)時(shí)候就可以采取使用反射機(jī)制。
2.當(dāng)代碼需要后期維護(hù)的時(shí)候,則需要修改很多地方,而通過反射機(jī)制,只需要直接修改一個(gè)地方即可。
e.g Person person=new Student();
三、應(yīng)用場景:一般應(yīng)用于底層框架的應(yīng)用,不過大部分都已經(jīng)封裝好了的、以及可以實(shí)現(xiàn)工廠模式和代理模式等設(shè)計(jì)模式,同時(shí)也可以解決java泛型擦除等令人苦惱的問題
一個(gè)類的組成:
成員變量、成員方法、構(gòu)造方法、修飾符、包等
四、反射的組成:1.Class(類本身) 2.Field(屬性) 3.Method(方法)
接下來就直接進(jìn)入代碼階段吧:
一、獲取類的三種方法:
Person person = new Person();
1.Class clazz = Person.class;//通過類來獲取對(duì)象
2.Class clazz = Class.forName("Reflect.Person");//通過類權(quán)限名(包名.類名)來獲取Class對(duì)象
//Class.forName會(huì)拋出異常,因?yàn)楦鶕?jù)字符串來找到類,所以可能會(huì)出現(xiàn)找不到這樣的類異常
3.Class clazz = person.getClass();//通過類對(duì)象來調(diào)用
二、自身類
Class []interfaces = clazz.getInterfaces();//獲取Person類里所有的接口
String classname = clazz.getName();//獲取類名字(包名.類名)
String simpleName = clazz.getSimpleName(); //僅僅只是獲得類名字,并沒有包名
int modifiers = clazz.getModifiers();//獲取權(quán)限符是什么 返回值是int 1:public 2:private依次
Package aPackage = clazz.getPackage();//獲得包名
Class superclass = clazz.getSuperclass();//獲取該類的父類,有且只有一個(gè)
Object o = clazz.newInstance();//生成類的實(shí)例對(duì)象,由于不知道要生成什么類的對(duì)象,而所有類的頂端都是Object的子類鄭州哪家醫(yī)院人流好 http://www.120csfkyy.com/
三、屬性(Filed)
Field math = clazz.getField("math");//獲得指定的name屬性,有且只能找到public的屬性
Field[] fields = clazz.getFields();//獲得所有的public的屬性,以及父類
Field id = clazz.getDeclaredField("id");//獲得public 以及private、protected等指定(id)屬性
Field[] declaredFields = clazz.getDeclaredFields();//獲得所有的屬性以及父類
當(dāng)然找到屬性能干嘛了,最重要的就是賦值啦。
由于私有屬性,除了本類以外的類都不可進(jìn)行其訪問,所以在設(shè)置值上面自然和public的不太一樣
public屬性設(shè)值:
Field name = clazz.getField("name");
name.set(o,"TTL");//第一個(gè)屬性是要設(shè)置值得屬性屬于哪個(gè)類實(shí)例化對(duì)象里面的,第二個(gè)參數(shù)則是要設(shè)置的值
private屬性設(shè)置:
Field sex = clazz.getDeclaredField("sex");
sex.setAccessible(true);//設(shè)置訪問權(quán)限
sex.set(person1,"女");
四、方法
Method setAddress = clazz.getMethod("Address", String.class);
//第一個(gè)參數(shù)為要找方法的名字,第二個(gè)參數(shù)則是要找方法的形參是什么類型的
Object address = setAddress.invoke(person1, "蘇州");
//第一個(gè)參數(shù)為類實(shí)例化的對(duì)象,第二個(gè)參數(shù)為參數(shù)要設(shè)置的值
//執(zhí)行方法
五、構(gòu)造方法
Constructor constructor = clazz.getConstructor(String.class, String.class);
//由于構(gòu)造方法和類名一樣,這里就不需要在此寫類名對(duì)象了,只需寫參數(shù)即可匹配到對(duì)應(yīng)的構(gòu)造方法
constructor.newInstance("TTL","四川");//執(zhí)行構(gòu)造方法
感謝各位的閱讀!關(guān)于“Java中的反射機(jī)制是什么意思”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。