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 条评论