Java反射之调用成员变量

本是古典 何须时尚 2023-07-09 05:28 103阅读 0赞

通过反射机制还可以调用成员变量,调用方法需要使用Field对象,它对应着一个方法,获得Field对象 需要使用Class类的如下方法:

  • Field[] getFields():返回所有公有成员变量Field对象数组。
  • Field[] getDeclaredFields():返回所有成员变量Field对象数组。
  • Field getField(String name):通过指定公共成员变量名返回Field对象。
  • Field getDeclaredField(String name):通过指定成员变量名返回Field对象。

现有一个Person类,它的代码如下:

  1. public class Person {
  2. private String name;
  3. private int age;
  4. public void setName(String name) {
  5. this.name = name;
  6. }
  7. public String getName() {
  8. return name;
  9. }
  10. public void setAge(int age) {
  11. this.age = age;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. @Override
  17. public String toString() {
  18. return "Person{" +
  19. "name='" + name + '\'' +
  20. ", age=" + age +
  21. '}';
  22. }
  23. }

现在编写一个程序通过反射机制调用Person类的私有成员变量name和age,具体代码如下:

  1. public class HelloWorld {
  2. public static void main(String[] args) {
  3. try {
  4. Class clz = Class.forName("Java反射机制.调用成员变量.Person");
  5. // 调用默认构造方法
  6. Person person = (Person) clz.newInstance();
  7. // 返回成员变量名为name的Field对象
  8. Field name = clz.getDeclaredField("name");
  9. // 设置成员变量accessible标志为ture:accessible是可访问性标志,值为 true 则指 示反射的对象在使用时应该取消Java语言访问检查
  10. name.setAccessible(true);
  11. // 为成员变量name赋值
  12. name.set(person,"tony");
  13. // 返回成员变量名为age的Field对象
  14. Field age = clz.getDeclaredField("age");
  15. // 设置成员变量accessible标志为ture
  16. age.setAccessible(true);
  17. // 为成员变量age赋值
  18. age.set(person,21);
  19. // 获取成员变量保存的数据
  20. System.out.printf("[name:%s, age:%d]",name.get(person),age.get(person));
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }

运行结果:

  1. [name:tony, age:21]

以上内容仅供参考学习,如有侵权请联系我删除!
如果这篇文章对您有帮助,左下角的大拇指就是对博主最大的鼓励。
您的鼓励就是博主最大的动力!

发表评论

表情:
评论列表 (有 0 条评论,103人围观)

还没有评论,来说两句吧...

相关阅读