1. 程式人生 > >《黑馬程式設計師》 使用反射獲取位元組碼檔案中的方法

《黑馬程式設計師》 使用反射獲取位元組碼檔案中的方法

public class ReflectMethod {
	/**
	 * 方法的反射
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		String str1="www.baidu.com";
		System.out.println(str1.charAt(2));
		//我們平時的時候是使用str1.charAt()去呼叫的方法,然後獲取到第二個字元
		/**
		 * String str1="aaa";
		 * String str2="aaaa";
		 * str1.charAt();
		 * str2.charAt();
		 * 我們只是使用某個物件來呼叫某個方法
		 * 方法和物件是沒有關係的
		 *  
		 *  呼叫方法,我們必須通過某個物件去呼叫.我們得到了某個方法,
		 *  方法和物件是沒有關係的。我們要想呼叫某個物件身上的方法,
		 *  就先得到這個方法,然後針對某個物件,呼叫這個方法
		 */
		
		//引數需要帶要獲取的方法的名稱
		Method methodCharAt=String.class.getMethod("charAt", int.class);
		//將方法作用在某個物件身上
		System.out.println("值為:"+methodCharAt.invoke(str1, 1));
		//我們來對這個方法的引數進行改寫:
		  //因為jdk1.4之前沒有可變引數,它是通過陣列來實現的
		
//		new int[]{1,23,44,55};
//		new String[]{"abc","def","kkk","qq"};
//		new String[]{new Sring("abd"),new String("def"),new String("kkk"),new String("123")};
//		new Object[]{new Sring("abd"),new String("def"),new String("kkk"),new String("123")};
//		new Object[]{new Sring("abd"),1,new String("kkk"),new String("123")};
		//本來1是不行的。但是jdk1.5之後有自動裝箱的功能。
		//所有的型別都是Object的子類
		//所以這樣就可以了
		
		System.out.println(methodCharAt.invoke(str1, new Object[]{5}));
		// new Object[]{} 這裡是代表一個引數都沒有 所有的類都是object的子類
		//new Object[]{2}  這裡就是表示有一個
		//new Object[]{2}  這裡就是new一個object的陣列,{數組裡面的元素列表},2就說明它是object的
//		 整數型別的object,把它給放到object陣列中去了,放的是Integer型別。自動裝箱了。這個時候,這個
//		 陣列的長度為1,裝了一個integer型別的物件.這個integer的值是2
	}
}