1.1.1 反射公開的非靜態的成員方法
Method getDeclaredMethod(String name,Class ... parameterTypes)獲取某個方法。
說明:
1)在Class類中提供的getDeclaredMethod方法上接收一個String name,name表示的是需要反射的那個方法的名字。
因為在一個類中可以有多個不同名的方法。在反射的時候需要指定這個方法的名字,同時在一個類中還可能出現方法的重載,這時還需要指定具體反射的是哪個方法參數類型。
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("=====================================");
}
}

