日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反射(Reflection)

發(fā)布時間:2023/12/8 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反射(Reflection) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

能夠分析類能力的程序稱為反射。

  • 檢查類的結(jié)構(gòu)(反射機(jī)制最重要的內(nèi)容)
  • 使用反射在運行時分析對象
  • 使用反射編寫泛型數(shù)組代碼
  • 調(diào)用任意方法與構(gòu)造器

動態(tài)語言的關(guān)鍵,允許程序在執(zhí)行期間借助 Reflection API 取得任何類的內(nèi)部信息,并能直接操作任意對象的內(nèi)部屬性及方法

因為在編譯的時候并沒有實例化對象,只有在運行時才能確定

加載完類之后,在堆內(nèi)存的方法區(qū)中就產(chǎn)生了一個 Class類型的對象(一個類只有一個Class對象),這個對象就包含了完整的類的結(jié)構(gòu)信息。我們可以通過這個對象看到類的結(jié)構(gòu)。

這個對象就像一面鏡子,透過這個鏡子看到類的結(jié)構(gòu),所以,我們形象的稱之為:反射。

  • 反射可以做什么?
  • 在運行時判斷一個對象所屬的類
  • 在運行時構(gòu)造一個類的對象
  • 在運行時判斷一個類所具有的成員變量和方法
  • 在運行時獲取泛型信息
  • 在運行時調(diào)用對象的成員變量和方法
  • 在運行時處理注解
  • 生成動態(tài)代理
  • 反射源頭:Class類,代表某一個運行時類,動態(tài)概念 (代表加載到內(nèi)存中的某一個結(jié)構(gòu),類、接口、數(shù)組、注解···)

    //獲取Class實例的方式 //1.調(diào)用運行時類的屬性 Class personClass = Person.class;//2.運行時類的對象 Person person = new Person(); Class personClass1 = person.getClass();//3.調(diào)用Class的靜態(tài)方法,傳入類的全類名,帶包(常用) Class forName = Class.forName("xyz.tylt.learn.test.Person");//4.使用類的加載器 ClassLoader classLoader = ATest.class.getClassLoader(); Class loadClass = classLoader.loadClass("xyz.tylt.learn.test.Person"); package xyz.tylt.learn.test;public class Person {private String name;public String password;public Person() {}private Person(String name) {this.name = name;}public Person(String name, String password) {this.name = name;this.password = password;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", password='" + password + '\'' +'}';}public void show(){System.out.println("你好呀,我是公開的方法");}private void pshow(){System.out.println("我是私有的方法");}} Person person = new Person("Tom", "123456"); System.out.println(person);person.show(); //在Person類外部不能通過對象調(diào)用其內(nèi)部私有結(jié)構(gòu),例如私有構(gòu)造器與方法 //反射方式 Class<Person> personClass = Person.class; Constructor<Person> constructor = personClass.getConstructor(String.class, String.class); //newInstance()創(chuàng)建對應(yīng)的運行時類對象,依舊是調(diào)用類的構(gòu)造器,一般都用空參,因為帶參通用性不強(qiáng) Person person = constructor.newInstance("Tom", "123456"); System.out.println(person); Class personClass = Person.class; //調(diào)用私有構(gòu)造器Constructor declaredConstructor = personClass.getDeclaredConstructor(String.class);declaredConstructor.setAccessible(true);Person person = (Person) declaredConstructor.newInstance("Tom");//調(diào)用私有方法Method pshow = personClass.getDeclaredMethod("pshow");pshow.setAccessible(true);pshow.invoke(person); //調(diào)用私有變量Field name = personClass.getDeclaredField("name");name.setAccessible(true);name.set(person, "Jerry");System.out.println(person);

    總結(jié)

    以上是生活随笔為你收集整理的反射(Reflection)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。