這篇文章給大家分享的是有關(guān)Java中的反射機制是什么意思的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在遵化等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需求定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計,網(wǎng)絡(luò)營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),遵化網(wǎng)站建設(shè)費用合理。
今天我們就來講講java的反射機制。
當(dāng)程序主動使用某個類的時候,如果該類還沒有被加載到內(nèi)存中,則系統(tǒng)會通過加載、連接、初始化這三個步驟對該類進行初始化,有時候會把這一整個流程叫做類加載器或類初始化
類加載時值將類文件讀入到內(nèi)存中,并且為該類創(chuàng)建一個對象、之后可以直接通過對象來調(diào)用類及其實現(xiàn)的父類方法和屬性
一、反射機制到底是什么:類是由一組對象(擁有著共同屬性)來組成的,而類與類之間也有共同的屬性、構(gòu)造方法、方法等結(jié)構(gòu),用來描述類的特性,即可以調(diào)用或查看某個類的屬性、方法、即構(gòu)造方法就叫做反射。
二、java反射機制的好處:
1.極大的提高了應(yīng)用程序的擴展性,之前都是通過多來將子類對象傳遞給父類應(yīng)用來實現(xiàn)的,大大的增加了代碼的耦合性,并且無法訪問真實對象的信息,這個時候就可以采取使用反射機制。
2.當(dāng)代碼需要后期維護的時候,則需要修改很多地方,而通過反射機制,只需要直接修改一個地方即可。
e.g Person person=new Student();
三、應(yīng)用場景:一般應(yīng)用于底層框架的應(yīng)用,不過大部分都已經(jīng)封裝好了的、以及可以實現(xiàn)工廠模式和代理模式等設(shè)計模式,同時也可以解決java泛型擦除等令人苦惱的問題
一個類的組成:
成員變量、成員方法、構(gòu)造方法、修飾符、包等
四、反射的組成:1.Class(類本身) 2.Field(屬性) 3.Method(方法)
接下來就直接進入代碼階段吧:
一、獲取類的三種方法:
Person person = new Person();
1.Class clazz = Person.class;//通過類來獲取對象
2.Class clazz = Class.forName("Reflect.Person");//通過類權(quán)限名(包名.類名)來獲取Class對象
//Class.forName會拋出異常,因為根據(jù)字符串來找到類,所以可能會出現(xiàn)找不到這樣的類異常
3.Class clazz = person.getClass();//通過類對象來調(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();//獲取該類的父類,有且只有一個
Object o = clazz.newInstance();//生成類的實例對象,由于不知道要生成什么類的對象,而所有類的頂端都是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)然找到屬性能干嘛了,最重要的就是賦值啦。
由于私有屬性,除了本類以外的類都不可進行其訪問,所以在設(shè)置值上面自然和public的不太一樣
public屬性設(shè)值:
Field name = clazz.getField("name");
name.set(o,"TTL");//第一個屬性是要設(shè)置值得屬性屬于哪個類實例化對象里面的,第二個參數(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);
//第一個參數(shù)為要找方法的名字,第二個參數(shù)則是要找方法的形參是什么類型的
Object address = setAddress.invoke(person1, "蘇州");
//第一個參數(shù)為類實例化的對象,第二個參數(shù)為參數(shù)要設(shè)置的值
//執(zhí)行方法
五、構(gòu)造方法
Constructor constructor = clazz.getConstructor(String.class, String.class);
//由于構(gòu)造方法和類名一樣,這里就不需要在此寫類名對象了,只需寫參數(shù)即可匹配到對應(yīng)的構(gòu)造方法
constructor.newInstance("TTL","四川");//執(zhí)行構(gòu)造方法
感謝各位的閱讀!關(guān)于“Java中的反射機制是什么意思”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!