小方的Java博客

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            27 隨筆 :: 17 文章 :: 115 評論 :: 0 Trackbacks
          1. Constructor
          /*
          介紹:
          Constructor?提供關于類的單個構造方法的信息以及對它的訪問權限。

          輸出:
          java.util.ArrayList:?Collection?
          java.util.ArrayList:?int?
          java.util.ArrayList:?
          */

          package ?api.java.lang.reflect;

          import ?java.lang.reflect.Constructor;

          public ? class ?Class_Constructor? {

          ????
          public ? static ? void ?main(String[]?args)? {
          ????????
          try ? {
          ????????????Class?c?
          = ?Class.forName( " java.util.ArrayList " );

          ????????????Constructor?constructors[]?
          = ?c.getConstructors();
          ????????????
          for ?( int ?i? = ? 0 ;?i? < ?constructors.length;?i ++ )? {
          ????????????????System.out.print(constructors[i].getName()?
          + ? " :? " );
          ????????????????Class?parameters[];
          ????????????????
          // 分別得到ArrayList三個構造函數的參數
          ????????????????parameters? = ?constructors[i].getParameterTypes();
          ????????????????
          for ?( int ?j? = ? 0 ;?j? < ?parameters.length;?j ++ )? {
          ????????????????????
          // 得到參數名
          ????????????????????String?s? = ?parameters[j].getName();
          ????????????????????s?
          = ?s.substring(s.lastIndexOf( " . " )? + ? 1 ,?s.length());
          ????????????????????System.out.print(s?
          + ? " ? " );
          ????????????????}

          ????????????????System.out.println(
          "" );
          ????????????}

          ????????}
          ? catch ?(Exception?ex)? {
          ????????????ex.printStackTrace();
          ????????}

          ????}

          }

          主要經驗值獲得:
          1.java.lang.reflect.Constructor 作用
          2.如何獲得一個類構造函數的參數

          次要經驗值獲得:

          1.s?=?s.substring(s.lastIndexOf(".")?+?1,?s.length());? 得到指定符號后的字符串

          ----------------------------------------------------------------------------------------------

          2. Skill_HiddenFieldModification
          /*
          輸出:
          Before:?[a=21.25,?b=54.5,?c=5665,?d=2043,?e=3121,?f=1019]
          After:?[a=21.25,?b=54.5,?c=0,?d=0,?e=0,?f=0]
          ?
          */

          package?api.java.lang.reflect;

          import?java.lang.reflect.Field;

          public?class?Skill_HiddenFieldModification?{

          ????
          //?把所有int置為0
          ????public?static?void?initIntFields(final?Object?obj)?{
          ????????
          try?{
          ????????????
          /*
          ?????????????*?getDeclaredFields()?返回?Field?對象的一個數組,這些對象反映此?Class
          ?????????????*?對象所表示的類或接口所聲明的所有字段,包括公共、保護、默認(包)訪問和私有字段,但不包括繼承的字段。
          ?????????????
          */

          ????????????Field[]?fields?
          =?obj.getClass().getDeclaredFields();
          ????????????
          for?(int?idx?=?0;?idx?<?fields.length;?idx++)?{
          ????????????????
          //如果是int
          ????????????????if?(fields[idx].getType()?==?int.class)?{
          ????????????????????
          /*?setAccessible(boolean)
          ?????????????????????*?將此對象的?accessible?標志設置為指示的布爾值。值為?true?則指示反射的對象在使用時應該取消
          ?????????????????????*?Java?語言訪問檢查。值為?false?則指示反射的對象應該實施?Java?語言訪問檢查。
          ?????????????????????
          */
          ?
          ????????????????????fields[idx].setAccessible(
          true);
          ????????????????????fields[idx].setInt(obj,?
          0);
          ????????????????}

          ????????????}

          ????????}
          ?catch?(final?IllegalAccessException?ex)?{
          ????????????
          throw?new?RuntimeException(ex);
          ????????}

          ????}


          ????
          public?static?final?void?main(final?String[]?args)?{
          ????????SomeNumbers?value?
          =?new?SomeNumbers();
          ????????System.out.println(
          "Before:?"?+?value);
          ????????initIntFields(value);
          ????????System.out.println(
          "After:?"?+?value);
          ????}

          }


          class?SomeNumbers?{

          ????
          public?double?a?=?21.25d;

          ????
          public?float?b?=?54.5f;

          ????
          public?int?c?=?5665;

          ????
          public?int?d?=?2043;

          ????
          protected?int?e?=?3121;

          ????
          private?int?f?=?1019;

          ????
          public?String?toString()?{
          ????????
          return?new?String("[a="?+?a?+?",?b="?+?b?+?",?c="?+?c?+?",?d="?+?d
          ????????????????
          +?",?e="?+?e?+?",?f="?+?f?+?"]");
          ????}

          }

          主要經驗值獲得:
          1.java.lang.reflect.Field 作用
          2.基本類型過濾的方法

          ---------------------------------------------------------------------------------------------

          3. Class_MethodgetModifiers

          /*
          輸出:
          Public?Methods:
          ?a1
          ?a2
          */

          package?api.java.lang.reflect;

          import?java.lang.reflect.Method;
          import?java.lang.reflect.Modifier;

          public?class?Class_MethodgetModifiers?{

          ????
          public?static?void?main(String[]?args)?{
          ????????
          try?{
          ????????????MyClass?a?
          =?new?MyClass();
          ????????????Class?c?
          =?a.getClass();
          ????????????System.out.println(
          "Public?Methods:");
          ????????????
          //得到所有類的方法
          ????????????Method?methods[]?=?c.getDeclaredMethods();
          ????????????
          for?(int?i?=?0;?i?<?methods.length;?i++)?{
          ????????????????
          //得到方法的修飾符
          ????????????????int?modifiers?=?methods[i].getModifiers();
          ????????????????
          if?(Modifier.isPublic(modifiers))?{
          ????????????????????System.out.println(
          "?"?+?methods[i].getName());
          ????????????????}

          ????????????}

          ????????}
          ?catch?(Exception?e)?{
          ????????????System.out.println(
          "Exception:?"?+?e);
          ????????}


          ????}

          }


          class?MyClass?{
          ????
          public?void?a1()?{}
          ????
          public?void?a2()?{}
          ????
          protected?void?a3()?{}
          ????
          private?void?a4()?{}
          }

          主要經驗值獲得:
          1.java.lang.reflect.Method 作用
          2.java.lang.reflect.Modifier 作用


          ---------------------------------------------------------------------------------------------

          4. Method_Invoke

          /*
          ?輸出:
          ?public?void?api.java.lang.reflect.MyClass2.print(java.lang.String,int)
          ?inovke?succeed:haha10
          ?
          */

          package?api.java.lang.reflect;

          import?java.lang.reflect.InvocationTargetException;
          import?java.lang.reflect.Method;

          public?class?Method_Invoke?{

          ????
          public?static?void?main(String[]?args)?{
          ????????
          try?{
          ????????????MyClass2?myclass?
          =?new?MyClass2();
          ????????????Class?c?
          =?myclass.getClass();

          ????????????Class[]?cc?
          =?new?Class[2];
          ????????????cc[
          0]?=?String.class;
          ????????????cc[
          1]?=?Integer.TYPE;

          ????????????
          /*
          ?????????????*?getMethod(String,Class[]?返回一個?Method?對象,它反映此?Class
          ?????????????*?對象所表示的類或接口的指定公共成員方法。name?參數是一個?String,用于指定所需方法的簡稱。parameterTypes
          ?????????????*?參數是按聲明順序標識該方法形式參數類型的?Class?對象的一個數組。如果?parameterTypes?為
          ?????????????*?null,則按空數組處理。
          ?????????????
          */

          ????????????Method?m?
          =?c.getMethod("print",?cc);
          ????????????System.out.println(m);

          ????????????Object?arglist[]?
          =?new?Object[2];
          ????????????arglist[
          0]?=?new?String("haha");
          ????????????arglist[
          1]?=?new?Integer(10);
          ????????????
          /*
          ?????????????*?Object?invoke(Object,?Object[])
          ?????????????*?Object?-?從中調用基礎方法的對象?
          ?????????????*?Object[]?-?用于方法調用的參數
          ?????????????
          */

          ????????????m.invoke(myclass,?arglist);
          ????????}
          ?catch?(NoSuchMethodException?e2)?{
          ????????????System.out.println(
          "method?doesn't?exist");
          ????????}
          ?catch?(IllegalAccessException?e3)?{
          ????????????System.out.println(
          "no?permission?to?invoke?that?method");
          ????????}
          ?catch?(InvocationTargetException?e)?{
          ????????????System.out
          ????????????????????.println(
          "an?exception?ocurred?while?invoking?that?method");
          ????????????System.out.println(
          "Method?threw?an:?"?+?e.getTargetException());
          ????????}

          ????}

          }


          class?MyClass2?{
          ????
          public?void?print(String?str,?int?i)?{
          ????????System.out.print(
          "inovke?succeed:"?+?str?+?i);
          ????}

          }


          主要經驗值獲得:
          1.java.lang.reflect.Method 的 invoke() 的作用

          ---------------------------------------------------------------------------------------------

          5.Class_ParameterizedType
          /*
          輸出:
          java.util.ArrayList<java.lang.String>
          class?java.lang.String
          */

          package?api.java.lang.reflect;

          import?java.lang.reflect.ParameterizedType;
          import?java.lang.reflect.Type;
          import?java.util.ArrayList;

          public?class?Class_ParameterizedType?{

          ????
          /**
          ?????*?
          @param?args
          ?????
          */

          ????
          public?static?void?main(String[]?args)?{
          ????????Type?type?
          =?StringList.class.getGenericSuperclass();
          ????????System.out.println(type);?
          ????????ParameterizedType?pt?
          =?(ParameterizedType)?type;
          ????????System.out.println(pt.getActualTypeArguments()[
          0]);

          ????}

          }


          class?StringList?extends?ArrayList<String>?{
          }


          主要經驗值獲得:
          1.如何得到泛型以及其ActualTypeArguments

          ---------------------------------------------------------------------------------------------

          6.
          posted on 2006-08-15 14:09 方佳瑋 閱讀(2986) 評論(1)  編輯  收藏 所屬分類: JAVA API 自學

          評論

          # re: [整理] java.lang.reflect 2008-09-12 09:41 的撒旦撒
          不錯  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 织金县| 鄂尔多斯市| 霍林郭勒市| 刚察县| 乐陵市| 张家界市| 科尔| 扎赉特旗| 垦利县| 宜阳县| 渑池县| 大冶市| 桦川县| 塔河县| 启东市| 镇安县| 汨罗市| 衢州市| 柳林县| 芒康县| 洞头县| 沾益县| 南通市| 原阳县| 镇康县| 托克托县| 罗山县| 康定县| 武川县| 抚松县| 利辛县| 荥经县| 康乐县| 墨脱县| 大埔区| 忻城县| 信宜市| 周口市| 奉新县| 兴化市| 当涂县|