Java反射機制

      網(wǎng)友投稿 787 2022-05-30

      反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。【翻譯于 官方文檔】

      本篇將從以下幾個方面講述反射的知識:

      calss的使用

      方法的反射

      構(gòu)造函數(shù)的反射

      成員變量的反射

      一、什么是class類

      在面向?qū)ο蟮氖澜缋铮f物皆對象。類是對象,類是java.lang.Class類的實例對象。另外class類只有java虛擬機才能new出來。任何一個類都是Class 類的實例對象。這實例對象有三種表達方式:

      public?class?User{ } public?class?ClassTest{ User?u=new?User(); ?//方式1: ?Class?c1=User.class; //方式2: Class?c2=u.getClass(); //方式3: Class?c3=Class.forName("com.forezp.User"); //可以通過類的類型創(chuàng)建該類的實例對象 User?user=(User)c1.newInstance(); }

      二、class類的動態(tài)加載

      Class.forName(類的全稱);該方法不僅表示了類的類型,還代表了動態(tài)加載類。編譯時刻加載類是靜態(tài)加載、運行時刻加載類是動態(tài)加載類。

      三、獲取方法信息

      基本的數(shù)據(jù)類型,void關(guān)鍵字都Class 類的實例;可以通過get

      ame();getSimpleName()獲取類的名稱。

      Class?c1=String.class; Class?c2=int.class; Class?c3=void.class; System.out.println(c1.getName()); System.out.println(c2.getSimpleName());

      獲取類的所有方法,并打印出來:

      public?static?void?printClassInfo(Object?object){ ????????Class?c=object.getClass(); ????????System.out.println("類的名稱:"+c.getName()); ????????/** ?????????*?一個成員方法就是一個method對象 ?????????*?getMethod()所有的?public方法,包括父類繼承的?public ?????????*?getDeclaredMethods()獲取該類所有的方法,包括private?,但不包括繼承的方法。 ?????????*/ ????????Method[]?methods=c.getMethods();//獲取方法 ????????//獲取所以的方法,包括private?,c.getDeclaredMethods(); ????????for(int?i=0;i

      public?class?ReflectTest?{ ????????public?static?void?main(String[]?args){ ????????????????String?s="ss"; ????????????????ClassUtil.printClassInfo(s); ????????} }

      運行:

      類的名稱:java.lang.String

      booleanequals(java.lang.Object,)

      java.lang.StringtoString()

      inthashCode()

      四、獲取成員變量的信息

      也可以獲取類的成員變量信息

      public?static?void?printFiledInfo(Object?o){ ????????Class?c=o.getClass(); ????????/** ?????????*?getFileds()獲取public ?????????*?getDeclaredFields()獲取所有 ?????????*/ ????????Field[]?fileds=c.getDeclaredFields(); ????????for(Field?f:fileds){ ????????????//獲取成員變量的類型 ????????????Class?filedType=f.getType(); ????????????System.out.println(filedType.getName()+"?"+f.getName()); ????????} ????}

      public?static?void?main(String[]?args){ ????????????????String?s="ss"; ????????????????//ClassUtil.printClassInfo(s); ????????????????ClassUtil.printFiledInfo(s); ????????}

      運行:

      [C value

      int hash

      long serialVersionUID

      [Ljava.io.ObjectStreamField; serialPersistentFields

      java.util.Comparator CASE_INSENSITIVE_ORDER

      int HASHING_SEED

      int hash32

      五、獲取構(gòu)造函數(shù)的信息

      public?static?void?printConstructInfo(Object?o){ ????????Class?c=o.getClass(); ????????Constructor[]?constructors=c.getDeclaredConstructors(); ????????for?(Constructor?con:constructors){ ????????????System.out.print(con.getName()+"("); ????????????Class[]?typeParas=con.getParameterTypes(); ????????????for?(Class?class1:typeParas){ ????????????????System.out.print(class1.getName()+"?,"); ????????????} ????????????System.out.println(")"); ????????} ????}

      public?static?void?main(String[]?args){ ????????????????String?s="ss"; ????????????????//ClassUtil.printClassInfo(s); ????????????????//ClassUtil.printFiledInfo(s); ????????????????ClassUtil.printConstructInfo(s); ????????}

      運行:

      java.lang.String([B ,)

      java.lang.String([B ,int ,int ,)

      Java的反射機制

      java.lang.String([B ,java.nio.charset.Charset ,)

      java.lang.String([B ,java.lang.String ,)

      java.lang.String([B ,int ,int ,java.nio.charset.Charset ,)

      java.lang.String(int ,int ,[C ,)

      java.lang.String([C ,boolean ,)

      java.lang.String(java.lang.StringBuilder ,)

      java.lang.String(java.lang.StringBuffer ,)

      六、方法反射的操作

      獲取一個方法:需要獲取方法的名稱和方法的參數(shù)才能決定一個方法。

      方法的反射操作:

      method.invoke(對象,參數(shù)列表);

      舉個例子:

      class?A{ ????public?void?add(int?a,int?b){ ????????System.out.print(a+b); ????} ????public?void?toUpper(String?a){ ????????System.out.print(a.toUpperCase()); ????} }

      public?static?void?main(String[]?args)?{ ????????A?a=new?A(); ????????Class?c=a.getClass(); ????????try?{ ????????????Method?method=c.getMethod("add",new?Class[]{int.class,int.class}); ????????????//也可以?Method?method=c.getMethod("add",int.class,int.class); ????????????//方法的反射操作 ????????????method.invoke(a,10,10); ????????}catch?(Exception?e){ ????????????e.printStackTrace(); ????????} ????}

      運行:

      20

      本篇文章已經(jīng)講解了java反射的基本用法, 它可以在運行時判斷任意一個對象所屬的類;在運行時構(gòu)造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調(diào)用任意一個對象的方法;生成動態(tài)代理。

      https://mp.weixin.qq.com/s?__biz=MzAxNjk4ODE4OQ==&mid=2247484116&idx=1&sn=e8b0f7f169096e67bbc317214abc53ad&chksm=9bed23a6ac9aaab009fba143b4a8ca4a11beb40139eda679c3e06f34e1180c6a0fef92a0005f&scene=21#wechat_redirect

      Java

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Spark為什么選擇Scala
      下一篇:五一假期充電指南:4月Github最熱門的Java項目推薦
      相關(guān)文章
      亚洲一区二区三区首页| 亚洲AV无码日韩AV无码导航| 亚洲男人的天堂在线| 亚洲av无码一区二区三区不卡| 精品国产亚洲男女在线线电影| 国产成人+综合亚洲+天堂| 亚洲狠狠婷婷综合久久| 亚洲色丰满少妇高潮18p| 亚洲精品午夜国产va久久| 精品亚洲AV无码一区二区三区| 亚洲国产成人超福利久久精品| 亚洲欧洲精品视频在线观看| 亚洲嫩草影院在线观看| 亚洲国产精品线观看不卡| 亚洲国产精品线观看不卡| 亚洲乱码中文论理电影| 亚洲一区二区三区播放在线| 亚洲一区二区三区久久| 国产成人精品亚洲2020| 亚洲欧美中文日韩视频| 亚洲av无码成人影院一区 | 国产精品亚洲а∨无码播放| 亚洲欧洲自拍拍偷午夜色无码| 亚洲精品中文字幕无码蜜桃| 国产亚洲高清不卡在线观看| 亚洲va在线va天堂va四虎 | 亚洲日韩一区二区三区| 亚洲精品无码高潮喷水A片软| 亚洲AV无码XXX麻豆艾秋| 国产亚洲视频在线| 亚洲熟伦熟女新五十路熟妇| 亚洲色无码专区在线观看| 亚洲成亚洲乱码一二三四区软件| 亚洲国产成人私人影院| 亚洲第一页中文字幕| 亚洲综合国产成人丁香五月激情| 亚洲精品人成网线在线播放va| 老牛精品亚洲成av人片| 精品国产香蕉伊思人在线在线亚洲一区二区 | 99久久亚洲综合精品成人网| 亚洲国产精品xo在线观看|