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); } }
共有 0 条评论