通过反射操作成员方法
阅读:269目录介绍
- 01.指定一个student类
- 02.反射调用公有方法
- 03.反射调用私有方法
01.指定一个student类
- 修改Student类,将get方法都指定为公有的,将set方法指定为私有的
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { System.out.println("调用了getName方法,Name:" + name); return name; } public int getAge() { System.out.println("调用了getAge方法,Age:" + age); return age; } private void setName(String name) { this.name = name; System.out.println("调用了setName方法,name:" + name); } private void setAge(int age) { this.age = age; System.out.println("调用了setAge方法,age:" + age); } }
02.反射调用公有方法
- java.lang.reflect.Method 实例是方法的代表对象,可以使用 invoke() 方法来动态调用指定的方法
- 首先来调用公有方法
public class Main { public static void main(String[] args) throws Exception { Class cl = Class.forName("net.zhifou.demo.Student"); // 指定构造函数 Constructor constructor = cl.getConstructor(String.class, Integer.TYPE); // 根据指定的构造函数来获取对象 Object object = constructor.newInstance("hello", 25); // 指定方法名称来获取对应的公开的Method实例 Method getName = cl.getMethod("getName"); // 调用对象object的方法 getName.invoke(object); // 指定方法名称来获取对应的公开的Method实例 Method getAge = cl.getMethod("getAge"); // 调用对象object的方法 getAge.invoke(object); } }
- 输出结果如下所示,可以知道Student对象的两个get方法成功被调用了。
调用了getName方法,Name:hello 调用了getAge方法,Age:25
03.反射调用私有方法
- 一般情况下,类的私有方法只有在其内部才可以被调用,通过反射我们可以来突破这一限制
- 受保护或私有方法的调用步骤略有不同
public class Main { public static void main(String[] args) throws Exception { Class cl = Class.forName("net.zhifou.demo.Student"); // 指定构造函数 Constructor constructor = cl.getConstructor(String.class, Integer.TYPE); // 根据指定的构造函数来获取对象 Object object = constructor.newInstance("tom", 25); // 指定方法名称来获取对应的私有的Method实例 Method setName = cl.getDeclaredMethod("setName", String.class); setName.setAccessible(true); setName.invoke(object, "jack"); // 指定方法名称来获取对应的私有的Method实例 Method setAge = cl.getDeclaredMethod("setAge", Integer.TYPE); setAge.setAccessible(true); setAge.invoke(object, 100); } }
- 输出结果如下所示,可以看到私有方法一样在外部被调用了
调用了setName方法,name:jack 调用了setAge方法,age:100
赞赏支持
