• Java反射


    目录

    1.什么是反射

    2. 获取class对象的三种方式

    3.利用反射获取构造方法

    4.利用反射获取成员变量

    5.利用反射获取成员方法

    6.反射的作用


    1.什么是反射

    反射允许对成员变量,成员方法和构造方法的信息进行编程访问

    2. 获取class对象的三种方式

    1. Class.forName("全类名");
    2. 类名.class
    3. 对象.getclass();

    例如:

    1. package yj.com.easthome2.day0910;
    2. /**
    3. * Class.forName("全类名");
    4. * 类名.class
    5. * 对象.getclass();
    6. */
    7. public class MyReflectDemo01 {
    8. public static void main(String[] args) throws ClassNotFoundException {
    9. // Class.forName("全类名");
    10. //最常用
    11. Class aClass = Class.forName("yj.com.easthome2.day0910.Student");
    12. System.out.println(aClass);//class yj.com.easthome2.day0910.Student
    13. //类名.class
    14. //更多作为参数传递
    15. Class studentClass = Student.class;
    16. System.out.println(studentClass);//class yj.com.easthome2.day0910.Student
    17. //对象.getclass();
    18. //我们已经有了这个类的对象时使用
    19. Student student = new Student();
    20. Classextends Student> aClass1 = student.getClass();
    21. System.out.println(aClass1);//class yj.com.easthome2.day0910.Student
    22. }
    23. }
    24. class Student {
    25. private String name;
    26. private int age;
    27. public Student() {
    28. }
    29. public Student(String name, int age) {
    30. this.name = name;
    31. this.age = age;
    32. }
    33. public String getName() {
    34. return name;
    35. }
    36. public void setName(String name) {
    37. this.name = name;
    38. }
    39. public int getAge() {
    40. return age;
    41. }
    42. public void setAge(int age) {
    43. this.age = age;
    44. }
    45. @Override
    46. public String toString() {
    47. return "Student{" +
    48. "name='" + name + '\'' +
    49. ", age=" + age +
    50. '}';
    51. }
    52. }

    3.利用反射获取构造方法

    Class类中用于获取构造方法的方法

    1. Constructor[] getConstructors(): 返回所有公共构造方法对象的数组
    2. Constructor[] getDeclaredConstructors(): 返回所有构造方法对象的数组
    3. ConstructorgetConstructor(Class... parameterTypes): 返回单个公共构造方法对象
    4. ConstructorgetDeclaredConstructor(Class... parameterTypes):返回单个构造方法对象

    Constructor类中用于创建对象的方法

    1. T newInstance(Object...initargs): 根据指定的构造方法创建对象
    2. setAccessible(boolean flag): 设置为true,表示取消访问检查

    例如:

    1. package yj.com.easthome2.day0910.MyReflectDemo02;
    2. import java.lang.reflect.Constructor;
    3. import java.lang.reflect.InvocationTargetException;
    4. import java.lang.reflect.Parameter;
    5. /**
    6. * Class类中用于获取构造方法的方法
    7. * Constructor[]getConstructors(): 返回所有公共构造方法对象的数组
    8. * Constructor[] getDeclaredConstructors(): 返回所有构造方法对象的数组
    9. * ConstructorgetConstructor(Class... parameterTypes): 返回单个公共构造方法对象
    10. * ConstructorgetDeclaredConstructor(Class... parameterTypes):返回单个构造方法对象
    11. *
    12. * Constructor类中用于创建对象的方法
    13. * T newInstance(Object...initargs): 根据指定的构造方法创建对象
    14. * setAccessible(boolean flag): 设置为true,表示取消访问检查
    15. */
    16. public class MyReflectDemo02 {
    17. public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
    18. //1.获取class字节码文件对象
    19. Class aClass = Class.forName("yj.com.easthome2.day0910.MyReflectDemo02.Student");
    20. //2.获取所有公共构造方法们
    21. Constructor[] cons = aClass.getConstructors();
    22. for (Constructor constructor : cons) {
    23. System.out.println(constructor);
    24. // 结果:
    25. //public yj.com.easthome2.day0910.MyReflectDemo02.Student(java.lang.String)
    26. // public yj.com.easthome2.day0910.MyReflectDemo02.Student()
    27. }
    28. System.out.println("----------------");
    29. //3.获取所有构造方法
    30. Constructor[] dcs = aClass.getDeclaredConstructors();
    31. for (Constructor dc : dcs) {
    32. System.out.println(dc);
    33. // 结果:
    34. //private yj.com.easthome2.day0910.MyReflectDemo02.Student(java.lang.String,int)
    35. // protected yj.com.easthome2.day0910.MyReflectDemo02.Student(int)
    36. // public yj.com.easthome2.day0910.MyReflectDemo02.Student(java.lang.String)
    37. // public yj.com.easthome2.day0910.MyReflectDemo02.Student()
    38. }
    39. System.out.println("-----------------");
    40. //4.获取单个公共构造方法
    41. Constructor con = aClass.getDeclaredConstructor();
    42. System.out.println(con);
    43. //结果
    44. // public yj.com.easthome2.day0910.MyReflectDemo02.Student()
    45. Constructor con2 = aClass.getDeclaredConstructor(String.class);
    46. System.out.println(con2);
    47. //结果
    48. //public yj.com.easthome2.day0910.MyReflectDemo02.Student(java.lang.String)
    49. Constructor con3 = aClass.getDeclaredConstructor(int.class);
    50. System.out.println(con3);
    51. // protected yj.com.easthome2.day0910.MyReflectDemo02.Student(int)
    52. Constructor con4 = aClass.getDeclaredConstructor(String.class, int.class);
    53. System.out.println(con4);
    54. //private yj.com.easthome2.day0910.MyReflectDemo02.Student(java.lang.String,int)
    55. System.out.println("------------");
    56. int modifiers = con4.getModifiers();// 返回此类或接口的Java语言修饰符,以整数编码。
    57. System.out.println(modifiers);//2
    58. Parameter[] parameters = con4.getParameters();//获取这个构造方法所有的参数
    59. for (Parameter parameter : parameters) {
    60. System.out.println(parameter);
    61. // java.lang.String arg0
    62. // int arg
    63. }
    64. System.out.println("------------------------");
    65. //暴力反射
    66. con4.setAccessible(true);//临时取消权限的校验
    67. Object nn = con4.newInstance("念念", 10);
    68. System.out.println(nn);//Student{name='念念', age=10}
    69. }
    70. }
    71. class Student {
    72. private String name;
    73. private int age;
    74. public Student() {
    75. }
    76. public Student(String name) {
    77. this.name = name;
    78. }
    79. protected Student(int age) {
    80. this.age = age;
    81. }
    82. private Student(String name, int age) {
    83. this.name = name;
    84. this.age = age;
    85. }
    86. public String getName() {
    87. return name;
    88. }
    89. public void setName(String name) {
    90. this.name = name;
    91. }
    92. public int getAge() {
    93. return age;
    94. }
    95. public void setAge(int age) {
    96. this.age = age;
    97. }
    98. @Override
    99. public String toString() {
    100. return "Student{" +
    101. "name='" + name + '\'' +
    102. ", age=" + age +
    103. '}';
    104. }
    105. }

    4.利用反射获取成员变量

    Class类中用于获取成员变量的方法

    1. Field[] getFields():返回所有公共成员变量对象的数组
    2. Field[] getDeclaredFields():返回所有成员变量对象的数组
    3. Field getField(String name):返回单个公共成员变量对象
    4. Field getDeclaredField(String name):返回单个成员变量对象

    Field类中用于创建对象的方法

    1. void set(Object obj, Object value): 赋值
    2. Object get(Object obj) 获取值。

    例如:

    1. package yj.com.easthome2.day0910.MyReflectDemo03;
    2. import java.lang.reflect.Field;
    3. /**
    4. * Class类中用于获取成员变量的方法
    5. * Field[] getFields():返回所有公共成员变量对象的数组
    6. * Field[] getDeclaredFields():返回所有成员变量对象的数组
    7. * Field getField(String name):返回单个公共成员变量对象
    8. * Field getDeclaredField(String name):返回单个成员变量对象
    9. *
    10. * Field类中用于创建对象的方法
    11. * void set(Object obj, Object value): 赋值
    12. * Object get(Object obj) 获取值。
    13. */
    14. public class MyReflectDemo03 {
    15. public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
    16. //1.获取class字节码文件对象
    17. Class aClass = Class.forName("yj.com.easthome2.day0910.MyReflectDemo03.Student");
    18. //2.获取成员变量
    19. Field[] fields = aClass.getFields();
    20. for (Field field : fields) {
    21. System.out.println(field);
    22. //public java.lang.String yj.com.easthome2.day0910.MyReflectDemo03.Student.gender
    23. }
    24. System.out.println("----------------");
    25. //获取所有成员变量,包括私有
    26. Field[] declaredFields = aClass.getDeclaredFields();
    27. for (Field declaredField : declaredFields) {
    28. System.out.println(declaredField);
    29. // private java.lang.String yj.com.easthome2.day0910.MyReflectDemo03.Student.name
    30. // private int yj.com.easthome2.day0910.MyReflectDemo03.Student.age
    31. // public java.lang.String yj.com.easthome2.day0910.MyReflectDemo03.Student.gender
    32. }
    33. System.out.println("--------------");
    34. //获取单个成员变量
    35. Field field = aClass.getField("gender");
    36. System.out.println(field);
    37. // public java.lang.String yj.com.easthome2.day0910.MyReflectDemo03.Student.gender
    38. //获取单个成员变量(私有)
    39. Field name = aClass.getDeclaredField("name");
    40. System.out.println(name);
    41. //private java.lang.String yj.com.easthome2.day0910.MyReflectDemo03.Student.name
    42. System.out.println("------------------");
    43. //获取权限修饰符
    44. int modifiers = name.getModifiers();
    45. System.out.println(modifiers);//2
    46. String name1 = name.getName();//获取成员变量名
    47. System.out.println(name1);//name
    48. Class type = name.getType();//获取数据类型
    49. System.out.println(type);//class java.lang.String
    50. //获取成员变量记录的值
    51. Student student = new Student("nn", 10, "男");
    52. name.setAccessible(true);
    53. Object o = name.get(student);
    54. System.out.println(o);//nn
    55. //修改对象里面记录的值
    56. name.set(student, "bb");
    57. System.out.println(student);
    58. // Student{name='bb', age=10, gender='男'}
    59. }
    60. }
    61. class Student {
    62. private String name;
    63. private int age;
    64. public String gender;
    65. public Student() {
    66. }
    67. public Student(String name, int age, String gender) {
    68. this.name = name;
    69. this.age = age;
    70. this.gender = gender;
    71. }
    72. public String getName() {
    73. return name;
    74. }
    75. public void setName(String name) {
    76. this.name = name;
    77. }
    78. public int getAge() {
    79. return age;
    80. }
    81. public void setAge(int age) {
    82. this.age = age;
    83. }
    84. public String getGender() {
    85. return gender;
    86. }
    87. public void setGender(String gender) {
    88. this.gender = gender;
    89. }
    90. @Override
    91. public String toString() {
    92. return "Student{" +
    93. "name='" + name + '\'' +
    94. ", age=" + age +
    95. ", gender='" + gender + '\'' +
    96. '}';
    97. }
    98. }

    5.利用反射获取成员方法

    Class类中用于获取成员方法的方法

    1. Method[] getMethods(): 返回所有公共成员方法对象的数组,包括继承的
    2. Method[] getDeclaredMethods(): 返回所有成员方法对象的数组,不包括继承的
    3. Method getMethod(String name, Class... parameterTypes): 返回单个公共成员方法对象
    4. Method getDeclaredMethod(String name, Class... parameterTypes): 返回单个成员方法对象

    Method类中用于创建对象的方法

    1. Object invoke(Object obj,Object... args): 运行方法
      1. 参数一:用obj对象调用该方法
      2. 参数二:调用方法的传递的参数(如果没有就不写)
      3. 返回值:方法的返回值(如果没有就不写)

    例如:

    1. package yj.com.easthome2.day0910.MyReflectDemo04;
    2. import java.io.IOException;
    3. import java.lang.reflect.Method;
    4. import java.lang.reflect.Parameter;
    5. /**
    6. * Class类中用于获取成员方法的方法
    7. * Method[] getMethods(): 返回所有公共成员方法对象的数组,包括继承的
    8. * Method[] getDeclaredMethods(): 返回所有成员方法对象的数组,不包括继承的
    9. * Method getMethod(String name, Class... parameterTypes): 返回单个公共成员方法对象
    10. * Method getDeclaredMethod(String name, Class... parameterTypes): 返回单个成员方法对象
    11. *
    12. * Method类中用于创建对象的方法
    13. * Object invoke(Object obj,Object... args): 运行方法
    14. * 参数一:用obj对象调用该方法
    15. * 参数二:调用方法的传递的参数(如果没有就不写)
    16. * 返回值:方法的返回值(如果没有就不写)
    17. */
    18. public class MyReflectDemo04 {
    19. public static void main(String[] args) throws Exception {
    20. //1.获取class字节码文件对象
    21. Class aClass = Class.forName("yj.com.easthome2.day0910.MyReflectDemo04.Student");
    22. // Method[] getMethods(): 返回所有公共成员方法对象的数组,包括继承的
    23. Method[] methods = aClass.getMethods();
    24. for (Method method : methods) {
    25. System.out.println(method);
    26. //public java.lang.String yj.com.easthome2.day0910.MyReflectDemo04.Student.toString()
    27. // public java.lang.String yj.com.easthome2.day0910.MyReflectDemo04.Student.getName()
    28. // public void yj.com.easthome2.day0910.MyReflectDemo04.Student.setName(java.lang.String)
    29. // public void yj.com.easthome2.day0910.MyReflectDemo04.Student.sleep()
    30. // public int yj.com.easthome2.day0910.MyReflectDemo04.Student.getAge()
    31. // public void yj.com.easthome2.day0910.MyReflectDemo04.Student.setAge(int)
    32. // public final void java.lang.Object.wait() throws java.lang.InterruptedException
    33. // public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
    34. // public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
    35. // public boolean java.lang.Object.equals(java.lang.Object)
    36. // public native int java.lang.Object.hashCode()
    37. // public final native java.lang.Class java.lang.Object.getClass()
    38. // public final native void java.lang.Object.notify()
    39. // public final native void java.lang.Object.notifyAll()
    40. }
    41. System.out.println("------------------------");
    42. //Method[] getDeclaredMethods(): 返回所有成员方法对象的数组,不包括继承的
    43. Method[] declaredMethods = aClass.getDeclaredMethods();
    44. for (Method declaredMethod : declaredMethods) {
    45. System.out.println(declaredMethod);
    46. //public java.lang.String yj.com.easthome2.day0910.MyReflectDemo04.Student.toString()
    47. // public java.lang.String yj.com.easthome2.day0910.MyReflectDemo04.Student.getName()
    48. // public void yj.com.easthome2.day0910.MyReflectDemo04.Student.setName(java.lang.String)
    49. // public void yj.com.easthome2.day0910.MyReflectDemo04.Student.sleep()
    50. // public int yj.com.easthome2.day0910.MyReflectDemo04.Student.getAge()
    51. // public void yj.com.easthome2.day0910.MyReflectDemo04.Student.setAge(int)
    52. // private void yj.com.easthome2.day0910.MyReflectDemo04.Student.eat(java.lang.String)
    53. }
    54. System.out.println("----------------------");
    55. //Method getMethod(String name, Class... parameterTypes): 返回单个公共成员方法对象
    56. Method m = aClass.getMethod("sleep", null);
    57. System.out.println(m);
    58. //public void yj.com.easthome2.day0910.MyReflectDemo04.Student.sleep()
    59. System.out.println("-----------------------------");
    60. // Method getDeclaredMethod(String name, Class... parameterTypes): 返回单个成员方法对象
    61. Method method = aClass.getDeclaredMethod("eat", String.class);
    62. System.out.println(method);
    63. //private void yj.com.easthome2.day0910.MyReflectDemo04.Student.eat(java.lang.String)
    64. System.out.println("---------------------");
    65. //获取方法的修饰符
    66. int modifiers = method.getModifiers();
    67. System.out.println(modifiers);//2
    68. //获取方法的名字
    69. String name = method.getName();
    70. System.out.println(name);//eat
    71. //获取方法的形参
    72. Parameter[] parameters = method.getParameters();
    73. for (Parameter parameter : parameters) {
    74. System.out.println(parameter);
    75. //java.lang.String arg0
    76. }
    77. System.out.println("-------------");
    78. //获取方法的抛出异常
    79. Class[] exceptionTypes = method.getExceptionTypes();
    80. for (Class exceptionType : exceptionTypes) {
    81. System.out.println(exceptionType);
    82. //class java.io.IOException
    83. // class java.lang.NoSuchFieldException
    84. }
    85. System.out.println("-----------------------------------");
    86. //获取方法的返回值
    87. Student student = new Student();
    88. //参数一:student表示方法的调用者
    89. //参数二:"红烧肉"表示在调用方法的时候传递的实际参数
    90. method.setAccessible(true);
    91. Object o = method.invoke(student, "红烧肉");//再吃红烧肉
    92. System.out.println(o);//好吃!
    93. }
    94. }
    95. class Student {
    96. private String name;
    97. private int age;
    98. public Student() {
    99. }
    100. public Student(String name, int age) {
    101. this.name = name;
    102. this.age = age;
    103. }
    104. public String getName() {
    105. return name;
    106. }
    107. public void setName(String name) {
    108. this.name = name;
    109. }
    110. public int getAge() {
    111. return age;
    112. }
    113. public void setAge(int age) {
    114. this.age = age;
    115. }
    116. public void sleep() {
    117. System.out.println("睡觉");
    118. }
    119. private String eat(String food) throws IOException, NoSuchFieldException {
    120. System.out.println("再吃" + food);
    121. return "好吃!";
    122. }
    123. @Override
    124. public String toString() {
    125. return "Student{" +
    126. "name='" + name + '\'' +
    127. ", age=" + age +
    128. '}';
    129. }
    130. }

    6.反射的作用

    1. 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
    2. 结合配置文件,动态的创建对象并调用方法

    例如:

    1. package yj.com.easthome2.day0910.MyReflectDemo05;
    2. import java.io.BufferedWriter;
    3. import java.io.FileWriter;
    4. import java.io.IOException;
    5. import java.lang.reflect.Field;
    6. public class MyReflectDemo05 {
    7. public static void main(String[] args) throws Exception {
    8. Student s = new Student("nn", 10, '女', 162, "睡觉");
    9. Teacher t = new Teacher("bb", 2000);
    10. save(s);
    11. }
    12. public static void save(Object obj) throws IllegalAccessException, IOException {
    13. //1.获取字节码文件的对象
    14. Class aClass = obj.getClass();
    15. //创建io流
    16. BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\easthome\\ideaProjects\\javaSE\\java01\\src\\yj\\com\\easthome2\\day0910\\MyReflectDemo05\\aa.txt"));
    17. //2.获取所有成员变量
    18. Field[] fields = aClass.getDeclaredFields();
    19. for (Field field : fields) {
    20. field.setAccessible(true);
    21. //获取成员变量的名字
    22. String name = field.getName();
    23. //获取成员变量的值
    24. Object o = field.get(obj);
    25. // 写出数据
    26. bw.write(name + "=" + o);
    27. bw.newLine();
    28. }
    29. bw.close();
    30. }
    31. }
    32. class Student {
    33. private String name;
    34. private int age;
    35. private char gender;
    36. private double height;
    37. private String hobby;
    38. public Student() {
    39. }
    40. public Student(String name, int age, char gender, double height, String hobby) {
    41. this.name = name;
    42. this.age = age;
    43. this.gender = gender;
    44. this.height = height;
    45. this.hobby = hobby;
    46. }
    47. public String getName() {
    48. return name;
    49. }
    50. public void setName(String name) {
    51. this.name = name;
    52. }
    53. public int getAge() {
    54. return age;
    55. }
    56. public void setAge(int age) {
    57. this.age = age;
    58. }
    59. public char getGender() {
    60. return gender;
    61. }
    62. public void setGender(char gender) {
    63. this.gender = gender;
    64. }
    65. public double getHeight() {
    66. return height;
    67. }
    68. public void setHeight(double height) {
    69. this.height = height;
    70. }
    71. public String getHobby() {
    72. return hobby;
    73. }
    74. public void setHobby(String hobby) {
    75. this.hobby = hobby;
    76. }
    77. @Override
    78. public String toString() {
    79. return "Student{" +
    80. "name='" + name + '\'' +
    81. ", age=" + age +
    82. ", gender=" + gender +
    83. ", height=" + height +
    84. ", hobby='" + hobby + '\'' +
    85. '}';
    86. }
    87. }
    88. class Teacher {
    89. private String name;
    90. private double salary;
    91. public Teacher() {
    92. }
    93. public Teacher(String name, double salary) {
    94. this.name = name;
    95. this.salary = salary;
    96. }
    97. public String getName() {
    98. return name;
    99. }
    100. public void setName(String name) {
    101. this.name = name;
    102. }
    103. public double getSalary() {
    104. return salary;
    105. }
    106. public void setSalary(double salary) {
    107. this.salary = salary;
    108. }
    109. @Override
    110. public String toString() {
    111. return "Teacher{" +
    112. "name='" + name + '\'' +
    113. ", salary=" + salary +
    114. '}';
    115. }
    116. }

  • 相关阅读:
    ROS 语音交互(二)nlp
    实战SRC
    机器学习3-岭回归,Lasso,变量选择技术
    SCHNOKA施努卡:表面缺陷检测大致经历了三个阶段
    C和指针 第15章 输入/输出函数 15.12 刷新和定位函数
    深入浅出Pytorch中的计算细节_input/output
    vue使用&Mac+idea的vue开发环境配置
    Plink数据管理, 筛选个体和变异,合并不同的遗传文件,并附加一个表型
    Day66|图part5:130. 被围绕的区域、827.最大人工岛
    如何使用html、css制作一个期末作业网站【羽毛球体育运动主题html网页设计】
  • 原文地址:https://blog.csdn.net/m0_52896041/article/details/132790228