中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      Java的內省與反射

      時間:2024-06-19 12:06:41 SUN認證 我要投稿
      • 相關推薦

      關于Java的內省與反射

        很多同學在深入的接觸Java語言后就會發現這樣兩個詞:反射(Reflection)和內省(Introspector),經常搞不清楚這到底是怎么回事,在什么場合下應用以及如何使用?下面YJBYS小編為大家整理了關于Java的內省與反射的文章,希望對你有所幫助。

        內省

        內省是Java語言對Bean類屬性、事件的一種缺省處理方法。例如類A中有屬性name,那我們可以通過getName,setName來得到其值或者設置新的值。通過getName/setName來訪問name屬性,這就是默認的規則。Java中提供了一套API用來訪問某個屬性的getter/setter方法,通過這些API可以使你不需要了解這個規則,這些API存放于包java.beans中。

        一般的做法是通過類Introspector來獲取某個對象的BeanInfo信息,然后通過BeanInfo來獲取屬性的描述器(PropertyDescriptor),通過這個屬性描述器就可以獲取某個屬性對應的getter/setter方法,然后我們就可以通過反射機制來調用這些方法。下面我們來看一個例子,這個例子把某個對象的所有屬性名稱和值都打印出來:


      /*    
      *Createdon2004-6-29    
      */    
        
      packagedemo;    
        
      importjava.beans.BeanInfo;    
      importjava.beans.Introspector;    
      importjava.beans.PropertyDescriptor;    
        
      publicclassIntrospectorDemo{    
      Stringname;    
      publicstaticvoidmain(String[]args)throwsException{    
      IntrospectorDemodemo=newIntrospectorDemo();    
      demo.setName("WinterLau");    
        
      //如果不想把父類的屬性也列出來的話,    
      //那getBeanInfo的第二個參數填寫父類的信息    
      BeanInfobi=Introspector.getBeanInfo(demo.getClass(),Object.class);    
      PropertyDescriptor[]props=bi.getPropertyDescriptors();    
      for(inti=0;i<props.length;i++){    
      System.out.println(props[i].getName()+"="+    
      props[i].getReadMethod().invoke(demo,null));    
      }    
        
      }    
        
      publicStringgetName(){    
      returnname;    
      }    
        
      publicvoidsetName(Stringname){    
      this.name=name;    
      }    
      }  

        反射

        相對而言,反射比內省更容易理解一點。用一句比較白的話來概括,反射就是讓你可以通過名稱來得到對象(類,屬性,方法)的技術。例如我們可以通過類名來生成一個類的實例;知道了方法名,就可以調用這個方法;知道了屬性名就可以訪問這個屬性的值,還是寫兩個例子讓大家更直觀的了解反射的使用方法:


      //通過類名來構造一個類的實例    
      ClassClasscls_str=Class.forName("java.lang.String");    
      //上面這句很眼熟,因為使用過JDBC訪問數據庫的人都用過J    
      Objectstr=cls_str.newInstance();    
      //相當于Stringstr=newString();    
        
      //通過方法名來調用一個方法    
      StringmethodName="length";    
      Methodm=cls_str.getMethod(methodName,null);    
      System.out.println("lengthis"+m.invoke(str,null));    
      //相當于System.out.println(str.length()); 

        上面的兩個例子是比較常用方法。看到上面的例子就有人要發問了:為什么要這么麻煩呢?本來一條語句就完成的事情干嗎要整這么復雜?沒錯,在上面的例子中確實沒有必要這么麻煩。不過你想像這樣一個應用程序,它支持動態的功能擴展,也就是說程序不重新啟動但是可以自動加載新的功能,這個功能使用一個具體類來表示。首先我們必須為這些功能定義一個接口類,然后我們要求所有擴展的功能類必須實現我指定的接口,這個規定了應用程序和可擴展功能之間的接口規則,但是怎么動態加載呢?我們必須讓應用程序知道要擴展的功能類的類名,比如是test.Func1,當我們把這個類名(字符串)告訴應用程序后,它就可以使用我們第一個例子的方法來加載并啟用新的功能。這就是類的反射,請問你有別的選擇嗎?

      【Java的內省與反射】相關文章:

      JAVA認證基礎知識:基于反射機制的服務代理調用03-08

      2016年JAVA認證基礎知識:基于反射機制的服務代理調用03-03

      學習Java的技巧03-05

      java習題及答案03-26

      JAVA認證簡介03-19

      關于Java的import03-16

      Java入門基礎知識:Java IO(輸入/輸出)03-07

      JAVA認證開源技術:關于Java的對象equals方法03-04

      sun認證java程序員須知Java日志框架03-30

      主站蜘蛛池模板: 精品999无码在线观看| 岚皋县| 国产成人精品无码一区二区老年人| 国产av一区网址大全| 国产AV秘 无码一区二区三区| 亚洲人成网站在线播放小说| 超碰av男人一区二区| 亚洲色无码中文字幕| av在线观看亚洲天堂| 日韩啪啪精品一区二区亚洲av | 亚洲网站免费看| 黑人巨大亚洲一区二区久| 亚洲视频在线播放免费视频 | 国产高清一区在线观看| 美腿丝袜亚洲综合第一页| 丰满人妻无奈张开双腿av| 祁连县| 丝袜美腿网站一区二区| 国产在线拍偷自拍偷精品| 日韩精品一区二区三区在线观看的| 亚洲高清有码在线观看| 贵南县| 日本一区二区亚洲三区| 国产黄色污一区二区三区| 99久久国语露脸国产精品| 中文日产幕无线码一区中文| 太大太粗太爽免费视频| 国产精品免费av一区二区| 国产麻豆精品久久一二三| 达拉特旗| 徐汇区| 泊头市| 石景山区| 中文字幕人妻av一区二区啪啪| 襄城县| 亚洲人成网站在线播放小说| 定南县| 男女好痛好深好爽视频一区| 永泰县| 精品在免费线中文字幕久久| 久久国产精品免费一区六九堂 |