0x6 Java系列Java的反射機制

      網友投稿 656 2025-03-31

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

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

      ·??????calss的使用

      ·??????方法的反射

      ·??????構造函數的反射

      ·??????成員變量的反射

      一、什么是class類

      在面向對象的世界里,萬物皆對象。類是對象,類是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");

      //可以通過類的類型創建該類的實例對象

      User?user=(User)c1.newInstance();

      }

      二、class類的動態加載

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

      三、獲取方法信息

      基本的數據類型,void關鍵字都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();//獲取方法

      0x6 Java系列:Java的反射機制

      //獲取所以的方法,包括private?,c.getDeclaredMethods();

      for(int?i=0;i

      //得到方法的返回類型

      Class?returnType=methods[i].getReturnType();

      System.out.print(returnType.getName());

      //得到方法名:

      System.out.print(methods[i].getName()+"(");

      Class[]?parameterTypes=methods[i].getParameterTypes();

      for(Class?class1:parameterTypes){

      System.out.print(class1.getName()+",");

      }

      System.out.println(")");

      }

      }

      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

      五、獲取構造函數的信息

      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.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 ,)

      六、方法反射的操作

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

      方法的反射操作:

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

      舉個例子:

      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

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

      方志朋簡介:SpringCloud中國社區聯合創始人,博客訪問量突破一千萬,愛好開源,熱愛分享,活躍于各大社區,保持著非常強的學習驅動力,終身學習踐行者,終身學習受益者。目前就職于國內某家知名互聯網保險公司,擔任DEVOPS工程師,對微服務領域和持續集成領域研究較深,精通微服務框架SpringCloud

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:求和數據不準確(求和不準確怎么回事)
      下一篇:excel表格設置高度的教程(如何設置Excel表格高度)
      相關文章
      全亚洲最新黄色特级网站 | 亚洲av再在线观看| 亚洲熟妇无码一区二区三区导航| 久久久久亚洲精品天堂| 久久青青成人亚洲精品| 亚洲乱码国产乱码精品精| 亚洲一区二区三区国产精品| 亚洲国产成人爱av在线播放| 国产精品亚洲а∨无码播放麻豆| 豆国产96在线|亚洲| 亚洲精品国产首次亮相| 亚洲欧美日韩中文二区| 亚洲精品乱码久久久久久蜜桃图片| 亚洲人成欧美中文字幕| 亚洲国产成人综合精品| 国产精品亚洲专区无码牛牛| 国产综合激情在线亚洲第一页| 狠狠入ady亚洲精品| 亚洲成a人在线看天堂无码| 亚洲Av无码乱码在线观看性色 | 亚洲三区在线观看无套内射| 亚洲午夜国产精品无码老牛影视 | 国产99在线|亚洲| 亚洲人成综合网站7777香蕉| 亚洲七久久之综合七久久| 亚洲AV成人一区二区三区观看| 狠狠综合亚洲综合亚洲色| 亚洲精品无码99在线观看| 久久久久亚洲精品中文字幕| 国产成人A亚洲精V品无码| 国产亚洲福利精品一区| 色播亚洲视频在线观看| 亚洲毛片在线免费观看| 亚洲精品中文字幕无乱码麻豆| 亚洲人成色在线观看| 国产成人亚洲午夜电影| 亚洲片一区二区三区| 亚洲日韩欧洲乱码AV夜夜摸| 久久精品7亚洲午夜a| 亚洲福利视频网站| 亚洲熟女综合一区二区三区|