field [fiːld] 领域的意思 这里是指成员对象
    image.png
    image.png
    image.png

    1. package com.itheima.d4_reflect_field;
    2. import org.junit.Test;
    3. import java.lang.reflect.Field;
    4. /**
    5. 目标:反射_获取Field成员变量对象。
    6. 反射的第一步是先得到Class类对象。
    7. 1、Field getField(String name);
    8. 根据成员变量名获得对应Field对象,只能获得public修饰
    9. 2.Field getDeclaredField(String name);
    10. 根据成员变量名获得对应Field对象,只要申明了就可以得到
    11. 3.Field[] getFields();
    12. 获得所有的成员变量对应的Field对象,只能获得public的
    13. 4.Field[] getDeclaredFields();
    14. 获得所有的成员变量对应的Field对象,只要申明了就可以得到
    15. 小结:
    16. 获取全部成员变量:getDeclaredFields
    17. 获取某个成员变量:getDeclaredField
    18. */
    19. public class FieldDemo01 {
    20. /**
    21. * 1.获取全部的成员变量。
    22. * Field[] getDeclaredFields();
    23. * 获得所有的成员变量对应的Field对象,只要申明了就可以得到
    24. */
    25. @Test
    26. public void getDeclaredFields(){
    27. // a. 定位Class对象
    28. Class c = Student.class;
    29. // b.定位全部成员变量 getDeclaredFields返回的是一个Field[](成员对象)的数组
    30. Field[] fields = c.getDeclaredFields(); // 拿到所有的成员对象
    31. // c. 将成员对象遍历出来 (将成员数组遍历)
    32. for (Field field : fields) {
    33. System.out.println(field.getName() + "===>" + field.getType());
    34. /**
    35. * name===>class java.lang.String
    36. * age===>int
    37. * schoolName===>class java.lang.String
    38. * COUNTTRY===>class java.lang.String
    39. */
    40. }
    41. }
    42. /**
    43. 2.获取某个成员变量对象 Field getDeclaredField(String name);
    44. */
    45. @Test
    46. public void getDeclaredField() throws Exception {
    47. // a. 定位class对象
    48. Class c = Student.class;
    49. // b. 根据名称定位某个成员变量
    50. Field f = c.getDeclaredField("age"); // 获取成员名为 age的成员变量
    51. System.out.println(f.getName() + "===> " + f.getType()); // age===> int
    52. }
    53. }
    1. package com.itheima.d4_reflect_field;
    2. import org.junit.Test;
    3. import java.lang.reflect.Field;
    4. /**
    5. 目标:反射获取成员变量: 取值和赋值。
    6. Field的方法:给成员变量赋值和取值
    7. void set(Object obj, Object value):给对象注入某个成员变量数据
    8. Object get(Object obj):获取对象的成员变量的值。
    9. void setAccessible(true);暴力反射,设置为可以直接访问私有类型的属性。
    10. Class getType(); 获取属性的类型,返回Class对象。
    11. String getName(); 获取属性的名称。
    12. */
    13. public class FieldDemo02 {
    14. @Test
    15. public void setField() throws Exception{
    16. // a. 反射第一步,获取类对象
    17. Class c = Student.class;
    18. // b. 提取某个成员变量
    19. Field ageF = c.getDeclaredField("age");
    20. // 由于该成员是私有的,所以要暴力打开权限(只许一次)
    21. ageF.setAccessible(true);
    22. // c. 赋值
    23. Student s = new Student();
    24. ageF.set(s,18); // 为 成员变量赋值
    25. System.out.println(s);
    26. // d. 取值 由于取到的值是Field类型的数据,要进行int强转
    27. int age = (int) ageF.get(s);
    28. System.out.println(age);
    29. /**
    30. * 无参数构造器执行!
    31. * Student{name='null', age=18}
    32. * 18
    33. */
    34. }
    35. }
    1. package com.itheima.d4_reflect_field;
    2. public class Student {
    3. private String name;
    4. private int age;
    5. public static String schoolName;
    6. public static final String COUNTTRY = "中国";
    7. public Student(){
    8. System.out.println("无参数构造器执行!");
    9. }
    10. public Student(String name, int age) {
    11. System.out.println("有参数构造器执行!");
    12. this.name = name;
    13. this.age = age;
    14. }
    15. public String getName() {
    16. return name;
    17. }
    18. public void setName(String name) {
    19. this.name = name;
    20. }
    21. public int getAge() {
    22. return age;
    23. }
    24. public void setAge(int age) {
    25. this.age = age;
    26. }
    27. @Override
    28. public String toString() {
    29. return "Student{" +
    30. "name='" + name + '\'' +
    31. ", age=" + age +
    32. '}';
    33. }
    34. }