溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中的反射機(jī)制是什么意思

發(fā)布時(shí)間:2021-11-20 13:44:02 來源:億速云 閱讀:118 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(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ò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(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)容。

AI