反射:
Java反射機制:指的是在Java程序運行狀態中,對于任何一個類,都可以獲得這個類的所有屬性和方法;對于給定的一個對象,都能夠調用它的任意一個屬性和方法。這種動態獲取類的內容以及動態調用對象的方法稱為反射機制。Java的反射機制允許在對類未知的情況下,獲取類相關信息的方式變得更加多樣靈活,調用類中相應方法,是Java增加其靈活性與動態性的一種機制。
Java反射機制主要提供了以下功能:
- 在運行時判斷任意一個對象所屬的類;
- 在運行時構造任意一個類的對象;
- 在運行時判斷任意一個類所具有的成員變量和方法;
- 在運行時調用任意一個對象的方法。
Class類中存在以下幾個重要的方法:
-
- getName():
一個Class對象描述了一個特定類的特定屬性,而這個方法就是返回String形式的該類的簡要描述。
-
- newInstance()
該方法可以根據某個Class對象產生其對應類的實例。需要強調的是,它調用的是此類的默認構造方法。
-
- getClassLoader()
返回該Class對象對應的類的類加載器。
-
- .getComponentType()
該方法針對數組對象的Class對象,可以得到該數組的組成元素所對應對象的Class對象。例如:
int[] ints = new int[]{1,2,3};
Class class1 = ints.getClass();
Class class2 = class1.getComponentType();
而這里得到的class2對象所對應的就應該是int這個基本類型的Class對象。
-
- getSuperClass()
返回某子類所對應的直接父類所對應的Class對象。
-
- isArray()
判定此Class對象所對應的是否是一個數組對象。
小實例:
運行時輸入類名創建對象,然后輸入方法名,該對象調用該方法;
- 利用Scanner來獲取輸入的類的名字
注意:要調用的類寫在包內的話,輸入時的格式為:包名.類名
Scanner sc = new Scanner(System.in);System.out.println("請輸入類名:");String classname = sc.nextLine();// 獲取類名;
2..根據獲取到的類名,創建類( 調用Class.forName(className)方法),該過程會拋出一個沒有找到類的一個異常;
Class c;
//要調用的類class寫在包內的話,要加上包.類;try {c = Class.forName(classname);} catch (ClassNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}
3.根據我們創建的類,創建構造器(調用getConstructo()方法);
Constructor con = c.getConstructor(int.class);
getConstructor方法里面需要的參數類型,是你要調用的構造方法的參數類型。如果是String型的參數的話,那么該方法寫的就是 c.getConstructor(String.class)
4. 獲取要傳給需要調用的構造方法的參數值
System.out.println("請輸入構造的參數");
String cna=sc.nextLine();
5.根據構造器創建對象;
Object o=con.newInstance(Integer.parseInt(cna));
//Integer.parseInt(cna),把string類型的數據,轉換為int型
6.對象創建好之后,就可以調用方法了,首先是輸入我們的方法名
System.out.println("請輸入方法名:");
String name = sc.nextLine();// 獲取輸入的方法名;
7.得到方法名之后,獲取方法。
Method me=c.getMethod(name, int.class);//getMethod(方法名, 方法的參數類型)
8.在對象上面調用方法;
me.invoke(o,14);//me.invoke(對象,方法的參數);
這樣一個動態綁定的過程就完成了。當然這個過程會有很多的異常需要拋出。