Java的反射(reflection)機制是指在程序的
運行狀態中,可以構造任意一個類的對象,可以了解任意一個對象所屬的類,可以了解任意一個類的成員變量和方法,可以調用任意一個對象的屬性和方法。這種動態獲取程序信息以及動態調用對象的功能稱為Java語言的反射機制。反射被視為動態語言的關鍵。
都以Foo為類名舉例
表示實例對象的方式:
類名 表示名=new 類名();
//Foo的實例對象如何表示
Foo foo1 = new Foo();
任何一個類都是Class的實例對象,這個實例對象有三種表示方式:
任何一個類都有一個隱含的靜態成員變量class
第一種表示方式:
Class c1=Foo.class;//注意Class要大寫C
第二種表達方式:已經知道該類的對象通過getClass方法
第三中表達方式:
Class c3=null; try { c3=Class.forName("Foo的相對路徑"); } catch (Exception e) { e.printStackTrace(); } //可以使用newInstance方法創建Foo的實例對象 try { Foo foo=(Foo)c1.newInstance(); //(Foo)Foo是Foo的接口 foo.print(); }catch (Exception e){e.printStackTrace(); } 通過Foo的接口來找到Foo的類類型 然后通過newInstance()方法來初始化一個類 生成一個實例對象。 使用newInstance方法時必須保證:
這個類已經加載 這個類已經連接了。
完成這倆步的正是class的靜態方法forName()方法 這個方法調用了啟動類加載器(java api的加載器) 動態加載類 try{ Class c=class.forName(args[0]); 類名 表示名 =(接口)c.newInstance(); 表示名.方法(); }catch(Exception e){e.printStrckTrace}
最常用的是第一種方式.
但如果只獲得一個字符串,例如獲得String類對應的Class對象,則不能使用String.class方式,而是使用Class.forName("java.lang.String")。注意:如果要想獲得基本數據類型的Class對象,可以使用對應的打包類加上.TYPE,例如,Integer.TYPE可獲得int的Class對象,但要獲得Integer.class的Class對象,則必須使用Integer.class。在獲得Class對象后,就可以使用表13.4中的方法來取得Class對象的基本信息