Java-使用反射调用方法

使用反射调用方法:

1):获取方法所在类的字节码对象.

2):获取方法对象.

3):使用反射调用方法.

------------------------------------------------------------------------

如何使用反射调用一个方法:

在Method类中有方法:

public Object invoke(Object obj,Object... args):表示调用当前Method所表示的方法

参数:

obj: 表示被调用方法底层所属对象

Method m = clz.getMethod("sayHi",String.class);

args:表示调用方法是传递的实际参数

返回:

底层方法的返回结果

调用私有方法:

在调用私有方法之前:应该设置该方法为可访问的

又因为Method是AccessibleObject子类,所以Method中具有该方法.

sayGoodByeMethod.setAccessible(true);

class Person {
	public void work() {
		System.out.println("Person.work()"); 
	}

	public static void work(String name) {
		System.out.println("Person.work()" + name);
	}

	private String say(String name, int age) {
		System.out.println("Person.say()" + name + "," + age);
		return name + "," + age;
	}
}
public class MethodInvokeDemo {
	public static void main(String[] args) throws Exception {
		// 获取指定类的字节码文件
		Class clz = Person.class;
		Method m = clz.getMethod("work"); // new Person().work("xxx") 正常调用第二个方法
		// System.out.println(m);
		Object ret = m.invoke(clz.newInstance());
		// System.out.println(ret); //null 表示空返回 方法使用void修饰

		// 调用public static void work(String name) 调用静态方法
		m = clz.getMethod("work", String.class);// 得到该方法
		ret = m.invoke(null, "linwei"); // 没有返回 //静态方法的第一个参数设置为
										// null(静态方法不需要对象,任何字段都不会报错,根本不会用到)
										// invoke的第一个参数设置为null,
										// 可以调用静态方法

		// 调用private String say(String name, int age)
		m = clz.getDeclaredMethod("say", String.class, int.class);
		// 设置可访问的
		m.setAccessible(true);
		// 调用方法
		ret = m.invoke(clz.newInstance(), "linwei", 22);
		System.out.println(ret);
		System.out.println("===========================");
		Object obj = new Date();
		Class clz2 = obj.getClass();
		// System.out.println(clz2);
		Method method = clz2.getMethod("toLocaleString");
		Object ret2 = method.invoke(obj);
		System.out.println(ret2);

	}
}

 

版权声明:
作者:yfeer
链接:https://www.yfeer.com/867.html
来源:个人编程学习网
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>