閱讀626 返回首頁    go 阿裏雲 go 技術社區[雲棲]


使用反射獲取字節碼文件中的方法

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
	}
}


最後更新:2017-04-03 12:55:33

  上一篇:go Linux係統虛擬內存空間
  下一篇:go Android源碼分析-Alarm機製與Binder的交互