反射(Reflect)就是把Java類中的各種成分映射成相應的Java類。例如,一個Java類中用一個Class類的對象來表示,一個類中的組成部分:成員變量,方法,構造方法,包等等信息也用一個個的Java類來表示,就像汽車是一個類,汽車中的發動機,變速箱等等也是一個個類。
表示Java類的Class類顯然要提供一系列的方法,來獲取其中的變量,方法,構造方法,修飾符,包等信息,這些信息就是用相應類的實例對象來表示,它們就是Field、Method、Constructor、Package等等。
l 構造方法的反射應用
下面來用反射機制實現下面這行代碼
String str1 = new String(new StringBuffer("abc"));
如下:
Constructor constructor = String.class.getConstructor(StringBuffer.class); //得到某一個構造方法
String str2 = (String) constructor.newInstance(new StringBuffer("abc")); //創建實例對象
System.out.println(str2);
l 成員變量的反射應用
l 成員方法的反射應用
Method methodCharAt = String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str1, 1));
l 數組與Object的關係及其反射類型
int [] a1 = new int[]{1,2,3};
int [] a2 = new int[4];
int[][] a3 = new int[2][3];
String [] a4 = new String[]{"a","b","c"};
Object aObj1 = a1;
Object aObj2 = a4;
//Object[] aObj3 = a1;Object[]數組中的元素是Object,int []數組中的元素是int。這兩個就不能劃等號了
Object[] aObj4 = a3;
Object[] aObj5 = a4;
System.out.println(Arrays.asList(a1));//顯示不正常
System.out.println(Arrays.asList(a4)); //調用List Arrays.asList(Object[] a)即Object[] a=a4,所以可以調用
l 數組的反射應用(Array())
舉例: