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("=====================================");
}
}
标签: JAVA