通过反射机制还可以调用成员变量,调用方法需要使用Field对象,它对应着一个方法,获得Field对象 需要使用Class类的如下方法:
Field[] getFields():返回所有公有成员变量Field对象数组。
Field[] getDeclaredFields():返回所有成员变量Field对象数组。
Field getField(String name):通过指定公共成员变量名返回Field对象。
Field getDeclaredField(String name):通过指定成员变量名返回Field对象。
现有一个Person类,它的代码如下:
public class Person { private String name; private int age; public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
现在编写一个程序通过反射机制调用Person类的私有成员变量name和age,具体代码如下:
public class HelloWorld { public static void main(String[] args) { try { Class clz = Class.forName("Java反射机制.调用成员变量.Person"); // 调用默认构造方法 Person person = (Person) clz.newInstance(); // 返回成员变量名为name的Field对象 Field name = clz.getDeclaredField("name"); // 设置成员变量accessible标志为ture:accessible是可访问性标志,值为 true 则指 示反射的对象在使用时应该取消Java语言访问检查 name.setAccessible(true); // 为成员变量name赋值 name.set(person,"tony"); // 返回成员变量名为age的Field对象 Field age = clz.getDeclaredField("age"); // 设置成员变量accessible标志为ture age.setAccessible(true); // 为成员变量age赋值 age.set(person,21); // 获取成员变量保存的数据 System.out.printf("[name:%s, age:%d]",name.get(person),age.get(person)); } catch (Exception e) { e.printStackTrace(); } } }
运行结果:
[name:tony, age:21]