反射——获取成员变量

一时失言乱红尘 2023-08-17 16:08 187阅读 0赞

1、Class对象获取成员变量:

Class类的常用方法(获取Field对象):

1392562-20190821175801319-864958425.png

1392562-20190821175828639-802621123.png

创建Person类:

  1. package pers.reflect.person;
  2. public class Person {
  3. private String name;
  4. private int age;
  5. public String hobby;
  6. public String height;
  7. protected String sex;
  8. String address;
  9. public Person(){
  10. }
  11. public Person(String name,int age){
  12. this.name=name;
  13. this.age=age;
  14. }
  15. @Override
  16. public String toString() {
  17. return "Person [name=" + name + ", age=" + age + ", hobby=" + hobby
  18. + ", height=" + height + ", sex=" + sex + ", address=" + address
  19. + "]";
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public int getAge() {
  28. return age;
  29. }
  30. public void setAge(int age) {
  31. this.age = age;
  32. }
  33. }
  34. import java.lang.reflect.Field;
  35. import pers.reflect.person.Person;
  36. public class ReflectDemo {
  37. public static void main(String[] args) throws SecurityException,
  38. NoSuchFieldException, IllegalArgumentException,
  39. IllegalAccessException {
  40. Class c = Person.class;
  41. System.out.println("getFields(),获取公共的成员变量:");
  42. Field[] fields = c.getFields();
  43. for (Field field : fields) {
  44. System.out.println(field);
  45. }
  46. System.out.println("getField(),获取指定的公共的成员变量:");
  47. Field hobbyField = c.getField("hobby");
  48. System.out.println(hobbyField);
  49. System.out.println("getDeclaredFields(),获取所有的成员变量,与修饰符无关。");
  50. Field[] fields1 = c.getDeclaredFields();
  51. for (Field field : fields1) {
  52. System.out.println(field);
  53. }
  54. System.out.println("获取私有的指定的成员变量");
  55. Field nameField = c.getDeclaredField("age");
  56. System.out.println(nameField);
  57. }
  58. }

2、Field类的常用方法:

(1)返回变量的类型:

1392562-20190821180208433-1601311468.png

(2)返回属性的名字:

1392562-20190821180317944-395796861.png

  1. import java.lang.reflect.Field;
  2. import pers.reflect.person.Person;
  3. public class ReflectDemo1 {
  4. public static void main(String[] args) {
  5. Class c = Person.class;
  6. System.out.println("getDeclaredFields(),获取所有的成员变量,与修饰符无关。");
  7. System.out.println(); Field[] fields1 = c.getDeclaredFields(); for (Field field : fields1) { System.out.println("成员变量:"+field); System.out.println("属性的类型:"+field.getType()); System.out.println("属性的名字:"+field.getName()); System.out.println(); } } }

1392562-20190821193729869-389260766.png

1392562-20190821193900340-668220867.png

1392562-20190821193927600-224754183.png

  1. import java.lang.reflect.Field;
  2. import pers.reflect.person.Person;
  3. public class ReflectDemo2 {
  4. public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
  5. Class c = Person.class;
  6. System.out.println("getField(),获取指定的公共的成员变量:");
  7. Field hobbyField = c.getField("hobby"); System.out.println(hobbyField); Person p=new Person(); Object value=hobbyField.get(p); System.out.println(value); hobbyField.set(p, "张可可"); System.out.println(p); System.out.println(); } }

1392562-20190821194842629-1025039018.png

访问不是被public修饰的成员变量(要用暴力反射,否者无法访问):

  1. import java.lang.reflect.Field;
  2. import pers.reflect.person.Person;
  3. public class ReflectDemo3 {
  4. public static void main(String[] args) throws SecurityException,
  5. NoSuchFieldException, IllegalArgumentException,
  6. IllegalAccessException {
  7. Class c = Person.class;
  8. Field nameField = c.getDeclaredField("name");
  9. nameField.setAccessible(true);//暴力反射
  10. System.out.println(nameField); Person p = new Person(); Object value = nameField.get(p); System.out.println(value); nameField.set(p, "赵晓霞"); System.out.println(p); } }
  11. setAccessible(true);忽略权限修饰符的安全检查。

转载于:https://www.cnblogs.com/zhai1997/p/11390314.html

发表评论

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

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

相关阅读