1. 程式人生 > >反射獲取成員方法(Method)

反射獲取成員方法(Method)

set ima 靜態 http 方式 on() 我們 執行 通過反射

1.1.1 反射公開的非靜態的成員方法

Method getDeclaredMethod(String name,Class ... parameterTypes)獲取某個方法

說明:

1Class類中提供的getDeclaredMethod方法上接收一個String namename表示的是需要反射的那個方法的名字。

因為在一個類中可以有多個不同的方法。反射的時候需要指定這個方法的名字,同時在一個類中還可能出現方法的重載,這時還需要指定具體反射的是個方法參數類型

3讓反射到的一個方法運行,需要使用Method類中的invoke方法

技術分享圖片

Object invoke(Object obj, Object... args)

invoke方法中的第一個參數 Object obj:表示的是當前需要調用這個方法的那個對象

invoke方法中的第二個參數Object... args

表示的是真正需要運行的某個類中被反射的那個方法需要接收的真實參數

在調用Method類中的invoke方法的時候,其實底層是在運行被反射的那個方法,

既然是某個方法在運行,那麽方法運行完之後可能會有返回值

舉例:需求:我們想通過反射技術獲得Person類中的setName()函數,並讓其執行。

public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		//獲取Class對象
		Class clazz = Class.forName("com.baidu.reflect.demo.Person");
		/*
		 * 反射成員方法:
		 * public void setName(String name)
		 * 類中的非靜態的成員方法,需要對象調用,我們反射到方法之後,最後肯定是要運行這個方法
		 * 這時肯定還是需要對象的
		 * 
		 * Method getDeclaredMethod(String name, Class<?>... parameterTypes)  
		 * String name 反射的方法的名字
		 * Class<?>... parameterTypes 反射的方法接受的參數類型
		 */
		Method method = clazz.getDeclaredMethod("setName", String.class);
Person p = new Person();
		//通過非反射的方式執行setName函數
		/*
		 *  Person p = new Person();
		 * 	p.setName("趙四");
		 * 	System.out.println(p.getName());//趙四
		*/
		//通過反射的方式執行setName函數
		/*
		 * 讓反射到的一個方法運行,需要使用Method類中的invoke方法
		 *  
		 *  Object invoke(Object obj, Object... args)  
		 *  
		 *  invoke方法中的第一個參數 Object obj:表示的是當前需要調用這個方法的那個對象
		 *  invoke方法中的第二個參數Object... args:
		 *  		表示的是真正需要運行的某個類中被反射的那個方法需要接收的真實參數
		 *  在調用Method類中的invoke方法的時候,其實底層是在運行被反射的那個方法,
		 *  既然是某個方法在運行,那麽方法運行完之後可能會有返回值
		 */
		//執行setName函數   這句代碼就是在調用反射到Person類中的setName方法
		Object obj2 = method.invoke(p, "趙四");
		System.out.println(p);//cn.itcast.sh.reflect.demo.Person@7f21c5df
		System.out.println(obj2);//null
		System.out.println(p.getName());//趙四
		System.out.println("=====================================");
	}
}

  

技術分享圖片

反射獲取成員方法(Method)