通过反射获取成员方法并使用

本文记录Java学习过程中遇到的通过反射获取成员方法并使用~

在反射机制中,把类中的成员方法使用类Method表示。可通过Class类中提供的方法获取成员方法:

  • 返回获取一个方法:

public Method getMethod(String name, Class<?>... parameterTypes)

获取public 修饰的方法

public Method getDeclaredMethod(String name, Class<?>... parameterTypes)

获取任意的方法,包含私有的

参数1: name 要查找的方法名称;参数2:parameterTypes 该方法的参数类型

  • 返回获取多个方法:

public Method[] getMethods() 获取本类与父类中所有public 修饰的方法

public Method[] getDeclaredMethods() 获取本类中所有的方法(包含私有的)

示例代码:

public class MethodDemo {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {
		//获取Class对象
		Class c = Class.forName("ren.oliver.Person");
		
		//获取多个方法
		//Method[] methods = c.getMethods();
		Method[] methods = c.getDeclaredMethods();
		for (Method method : methods) {
			System.out.println(method);
		}
		
		System.out.println("-----------------------");
		//获取一个方法:
		//public void method1()
		Method method = c.getMethod("method1", null);
		System.out.println(method);
		//public String method4(String name){
		method = c.getMethod("method4", String.class);
		System.out.println(method);
		//私有方法
		//private void method5()
		method = c.getDeclaredMethod("method5", null);
		System.out.println(method);
	}
}
  • 通过反射,创建对象,调用指定的方法

获取成员方法,步骤如下:

  1. 获取Class对象
  2. 获取构造方法
  3. 通过构造方法,创建对象
  4. 获取指定的方法
  5. 执行找到的方法

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

执行指定对象obj中,当前Method对象所代表的方法,方法要传入的参数通过args指定。

示例代码:

public class MethodDemo2 {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		//1, 获取Class对象
		Class c = Class.forName("renoliver.Person");
		//2,获取构造方法
		//public Person(String name, int age, String address){
		Constructor con = c.getConstructor(String.class, int.class, String.class);
		//3,通过构造方法,创建对象
		Object obj = con.newInstance("小明", 23, "哈尔滨");
		//4,获取指定的方法
		//public void method1()  没有返回值没有参数的方法
		//Method m1 = c.getMethod("method1", null);
		
		//public String method4(String name)
		Method m4 = c.getMethod("method4", String.class);
		
		//5,执行找到的方法
		//m1.invoke(obj, null);
		
		Object result = m4.invoke(obj, "itcast");
		System.out.println("result = " + result);
	}
}
  • 通过反射,创建对象,调用指定的private 方法

获取私有成员方法,步骤如下:

  1. 获取Class对象
  2. 获取构造方法
  3. 通过构造方法,创建对象
  4. 获取指定的方法
  5. 开启暴力访问
  6. 执行找到的方法
public Object invoke(Object obj,  Object... args)
执行指定对象obj中,当前Method对象所代表的方法,方法要传入的参数通过args指定。

示例代码:

public class MethodDemo {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		//1, 获取Class对象
		Class c = Class.forName("ren.oliver.Person");
		//2,获取构造方法
		//public Person(String name, int age, String address){
		Constructor con = c.getConstructor(String.class, int.class, String.class);
		//3,通过构造方法,创建对象
		Object obj = con.newInstance("小明", 23, "哈尔滨");
		//4,获取指定的方法
		//private void method5(){
		Method m5 = c.getDeclaredMethod("method5", null);
		//5,开启暴力访问
		m5.setAccessible(true);
		//6,执行找到的方法
		m5.invoke(obj, null);
	}
}

标签: none