posts - 56, comments - 54, trackbacks - 0, articles - 4
             ::  ::  :: 聯(lián)系 :: 聚合  :: 管理

          Reflection是Java的一個(gè)重要特性。這種機(jī)制可以讓我們通過類名,方法名,數(shù)據(jù)成員名來得到相關(guān)的元素。
          關(guān)鍵類java.lang.Class:這個(gè)也是Object的子類 是利用反射機(jī)制的起點(diǎn)。
          1:產(chǎn)生Class object
          使用getClass()
          String str = "abc";
          Class c1 = str.getClass();

          使用Class.getSuperclass();
          Button b = new Button();
          Class c1 = b.getClass();
          Class c2 = c1.getSuperclass();

          使用static method Class.forName()
          Class c1 = Class.forName ("java.lang.String");
          Class c2 = Class.forName ("java.awt.Button");
          Class c3 = Class.forName ("java.util.LinkedList$Entry");

          使用 類名.class
          Class c1 = String.class;
          Class c2 = java.awt.Button.class;
          Class c3 = Main.InnerClass.class;
          Class c4 = int.class;
          Class c5 = int[].class;

          使用primitive wrapper classes的TYPE
          Class c1 = Boolean.TYPE;
          Class c2 = Byte.TYPE;
          Class c3 = Character.TYPE;
          Class c4 = Short.TYPE;
          Class c5 = Integer.TYPE;
          Class c6 = Long.TYPE;
          Class c7 = Float.TYPE;
          Class c8 = Double.TYPE;
          Class c9 = Void.TYPE;

          2:使用 Class object

          package  reflection;

          import  java.lang.reflect.Constructor;
          import  java.lang.reflect.Field;
          import  java.lang.reflect.Method;
          import  java.lang.reflect.Modifier;
          import  java.util.HashMap;

          public   class  TestRef  {

              
          public   static   void  main(String[] args)  throws  Exception {
                  TestRef testRef 
          =   new  TestRef();
                  Class clazz 
          =  TestRef. class ;
                  System.out.println(
          " getPackage() =  "   +  clazz.getPackage().getName());
                 
          //  getModifiers()的返回值可以包含類的種類信息。比如是否為public,abstract,static
                 int  mod  =  clazz.getModifiers();
                  System.out.println(
          " Modifier.isAbstract(mod) =  " + Modifier.isAbstract(mod));
                  System.out.println(
          " getName() =  " + clazz.getName());
                  System.out.println(
          " getSuperclass() =  " + clazz.getSuperclass().getName());
                  System.out.println(
          " getInterfaces() =  " + clazz.getInterfaces()); // 實(shí)現(xiàn)了哪些Interface
                 System.out.println( " clazz.getDeclaredClasses() =  " + clazz.getDeclaredClasses()); // 包含哪些內(nèi)部類
                 System.out.println( " getDeclaringClass() =  " + clazz.getDeclaringClass()); // 如果clazz是inner class 那么返回其outer class
                  
                  System.out.println(
          " ---------- " );
                  Constructor[] constructor 
          =  clazz.getDeclaredConstructors(); // 返回一組構(gòu)造函數(shù) Constructor[]
                   if  (constructor  !=   null ) {
                      
          for  ( int  i  =   0 ; i  <  constructor.length; i ++ {
                          System.out.println(constructor[i].getName());
                      }

                  }

                  
                  System.out.println(
          " ---------- " );
                  Method[] method 
          =  clazz.getDeclaredMethods();  //  Method[]
                   if  (method  !=   null ) {
                      
          for  ( int  i  =   0 ; i  <  method.length; i ++ {
                          System.out.println(method[i].getName());
                      }

                  }

                  
                  System.out.println(
          " ---------- " );
                  Field[] field 
          =  clazz.getDeclaredFields();  //  Field[]
                   if  (field  !=   null ) {
                      
          for  ( int  i  =   0 ; i  <  field.length; i ++ {
                          System.out.println(field[i].getName());
                          System.out.println(field[i].getType().getName());
                          System.out.println(field[i].get(testRef));
                      }

                  }

                  
                 
          //  動(dòng)態(tài)生成instance(無(wú)參數(shù))
                 Class clz  =  Class.forName( " reflection.TestRef " );
                  Object obj 
          =  clz.newInstance();
                  System.out.println(((TestRef)obj).getStr());
                  
                 
          //  動(dòng)態(tài)生成instance(有參數(shù))
                 Class[] params  =   new  Class[] {String. class int . class double . class } ;
                  Constructor construct 
          =  clz.getConstructor(params);
                 
          //  JDK1.5的情況下可以直接用{"haha",999,100.01}作為參數(shù)        
                 Object obj2  =  construct.newInstance( new  Object[] { " haha " new  Integer( 999 ),  new  Double( 100.01 )} ); 
                  System.out.println(((TestRef)obj2).getStr());
                  
                 
          //  動(dòng)態(tài)調(diào)用method(public method)
                 Class[] params2  =   new  Class[] {String. class } ;
                  Method methods 
          =  clz.getMethod( " setStr " , params2);
                  methods.invoke(testRef, 
          new  Object[] { " invoke method " } );
                  System.out.println(testRef.getStr());
                  
                 
          //  動(dòng)態(tài)改變field內(nèi)容(public field)
                 Field fields  =  clz.getField( " str " );
                  fields.set(testRef, 
          " set field's value " );
                  System.out.println(testRef.getStr());
                  
              }


            
          public  TestRef() {
                  System.out.println(
          " --- complete TestRef() --- " );
              }

              
             
          public  TestRef(String str,  int  i,  double  d) {
                  
          this .str  =  str;
                  
          this .i  =  i;
                  
          this .d  =  d;
                  System.out.println(
          " --- complete TestRef(String str, int i, double d) --- " );
              }

              
             
          public  String str  =   " I'm a string " ;

             
          int  i  =   1 ;

             
          double  d  =   3.14 ;

              HashMap map 
          =   new  HashMap();

              
          public   double  getD()  {
                  
          return  d;
              }


             
          public   void  setD( double  d)  {
                  
          this .d  =  d;
              }


             
          public   int  getI()  {
                  
          return  i;
              }


             
          public   void  setI( int  i)  {
                  
          this .i  =  i;
              }


             
          public  HashMap getMap()  {
                  
          return  map;
              }


             
          public   void  setMap(HashMap map)  {
                  
          this .map  =  map;
              }


             
          public  String getStr()  {
                  
          return  str;
              }


             
          public   void  setStr(String str)  {
                  
          this .str  =  str;
              }

          }


          3說明:
          上面代碼的運(yùn)行環(huán)境是JDK1.4.2_08
          動(dòng)態(tài)得到方法getMethod()和動(dòng)態(tài)得到數(shù)據(jù)成員getField()時(shí)要求訪問級(jí)別是public的。但是相應(yīng)的getDeclaredMethods() 和getDeclaredFields()可以得到private的元素。

          4補(bǔ)充:
          public class ReflectSecurity {
              public static void main(String[] args) {
                  try {
                      TwoString ts = new TwoString("a", "b");
                      Field field = clas.getDeclaredField("m_s1");
          //          field.setAccessible(true);
                      System.out.println("Retrieved value is " + field.get(inst));

                  } catch (Exception ex) {
                      ex.printStackTrace(System.out);
                  }
              }
          }

          如果我們編譯這一程序時(shí),不使用任何特定參數(shù)直接從命令行運(yùn)行,它將在field.get(inst)調(diào)用中拋出一個(gè)Class異常。
          如果我們不注釋field.setAccessible (true)代碼行,那么重新編譯并重新運(yùn)行該代碼,它將運(yùn)行成功。
          最 后,如果我們?cè)诿钚刑砑恿薐VM參數(shù) -Djava.security.manager 以實(shí)現(xiàn)安全性管理器,它仍然將不能通過運(yùn)行,會(huì)拋出java.security.AccessControlException,除非我們定義了 ReflectSecurity類的許可權(quán)限。


          主站蜘蛛池模板: 凌源市| 澎湖县| 隆回县| 临澧县| 巨鹿县| 普格县| 湘乡市| 茶陵县| 淮阳县| 绥滨县| 平乡县| 新丰县| 高唐县| 伊宁市| 普安县| 兴隆县| 宜良县| 循化| 丽水市| 蒙阴县| 南华县| 白山市| 铜梁县| 察雅县| 外汇| 枣强县| 富裕县| 上高县| 九龙县| 德庆县| 新野县| 蒙城县| 赣榆县| 沁水县| 威宁| 石棉县| 伊川县| 门源| 新津县| 河西区| 荥经县|