1. 基本概念

image.png

  • 通常来说, 反射机制就是用于动态创建对象并且动态调用方法的, 在运行阶段来动态编程

2. Class类

2.1 基本概念

image.png

2.2 获取Class类的实例

image.png

  1. package com.lagou.task20;
  2. /**
  3. * @author 西风月
  4. * @date 2020/8/30
  5. * @description
  6. */
  7. public class ClassTest {
  8. public static void main(String[] args) throws ClassNotFoundException {
  9. //1. 使用数据类型.class的方式可以获取对应类型的Class实例
  10. Class c1 = String.class;
  11. System.out.println("c1 = " + c1); //自动调用 toString方法 class java.lang.String
  12. c1 = int.class;
  13. System.out.println("c1 = " + c1); //int
  14. c1 = void.class;
  15. System.out.println("c1 = " + c1); //void
  16. System.out.println("===================================");
  17. //2. 使用对象.getClass()的方式获取对应的Class对象
  18. String str1 = new String("hello");
  19. c1 = str1.getClass();
  20. System.out.println("c1 = " + c1);
  21. Integer i1 = 19;
  22. c1 = i1.getClass();
  23. System.out.println("c1 = " + c1);
  24. int num = 5;
  25. //num.getClass(); 基本数据类型的变量不能调用方法,方法属于引用或对象中
  26. System.out.println("==========================");
  27. //3. 使用包装类.TYPE的方法获取对应的基本数据类型的Class对象
  28. c1 = Integer.TYPE;
  29. System.out.println("c1 = " + c1);
  30. c1 = Integer.class;
  31. System.out.println("c1 = " + c1);
  32. System.out.println("========================");
  33. //4. 调用Class类中的forName方法来获取对应的Class对象
  34. //c1 = Class.forName("String"); ClassNotFoundException 需要完整名称
  35. c1 = Class.forName("java.lang.String");
  36. System.out.println("c1 = " + c1);
  37. c1 = Class.forName("java.util.Date");
  38. System.out.println("c1 = " + c1);
  39. //c1 = Class.forName("int");
  40. //System.out.println("c1 = " + c1); ClassNotFoundException 基本数据类型不支持
  41. System.out.println("===============================");
  42. //5. 使用类加载器的方式来获取Class对象
  43. ClassLoader classLoader = ClassTest.class.getClassLoader();
  44. System.out.println("ClassLoader = " + classLoader);
  45. c1 = classLoader.loadClass("java.lang.String"); //NullPointerException
  46. System.out.println("c1 = " + c1);
  47. }
  48. }

2.3 常用的方法

image.png

  • T newInstance()
  1. package com.lagou.task20;
  2. import java.io.*;
  3. import java.util.Scanner;
  4. /**
  5. * @author 西风月
  6. * @date 2020/8/30
  7. * @description
  8. */
  9. public class PersonConstructorTest {
  10. public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException, IOException {
  11. //1. 使用原始方式以无参形式构造Person类型的对象并打印
  12. Person p1 = new Person();
  13. System.out.println("无参方式创建的对象是:" + p1);
  14. System.out.println("=======================");
  15. //2. 使用反射机制创建Person类型对象
  16. //2.1 创建对象的类型从输入获取
  17. //Person person = Person.class.newInstance();
  18. System.out.println("请输入要创建对象的类型:");
  19. Scanner sc = new Scanner(System.in);
  20. String str1 = sc.next();
  21. //Class c1 = Class.forName("com.lagou.task20.Person");
  22. Class c1 = Class.forName(str1);
  23. System.out.println("无参方式创建的对象是:" + c1.newInstance());
  24. //2.2 创建对象的类型从配置文件中读取
  25. BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("f:/a.txt")));
  26. String str =null;
  27. while((str = br.readLine()) != null) {
  28. c1 = Class.forName(str);
  29. System.out.println("无参方式创建的对象:" + c1.newInstance());
  30. }
  31. br.close();
  32. }
  33. }

3. Constructor类

3.1 基本的概念

image.png

3.2 Class类的常用方法

image.png

3.3 Contructor类的常用的方法

image.png

  1. package com.lagou.task20;
  2. import java.io.*;
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.util.Scanner;
  6. /**
  7. * @author 西风月
  8. * @date 2020/8/30
  9. * @description
  10. */
  11. public class PersonConstructorTest {
  12. public static void main(String[] args) throws Exception {
  13. //1. 使用原始方式以无参形式构造Person类型的对象并打印
  14. Person p1 = new Person();
  15. System.out.println("无参方式创建的对象是:" + p1);
  16. System.out.println("=======================");
  17. //2. 使用反射机制创建Person类型对象
  18. //2.1 创建对象的类型从输入获取
  19. //Person person = Person.class.newInstance();
  20. System.out.println("请输入要创建对象的类型:");
  21. Scanner sc = new Scanner(System.in);
  22. String str1 = sc.next();
  23. //Class c1 = Class.forName("com.lagou.task20.Person");
  24. Class c1 = Class.forName(str1);
  25. System.out.println("无参方式创建的对象是:" + c1.newInstance());
  26. //2.2 创建对象的类型从配置文件中读取
  27. BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("f:/a.txt")));
  28. String str =null;
  29. while((str = br.readLine()) != null) {
  30. c1 = Class.forName(str);
  31. System.out.println("无参方式创建的对象:" + c1.newInstance());
  32. }
  33. br.close();
  34. //获取Class对象对应类中的无参构造方法
  35. c1 = Class.forName("com.lagou.task20.Person");
  36. Constructor constructor = c1.getConstructor(String.class, int.class);
  37. //使用获取无参构造方法构造对应的对象
  38. //newInstance的形式参数是给Class对象的构造方法初始化
  39. System.out.println("无参方式创建的对象是:" + constructor.newInstance("张三", 60));
  40. Constructor[] constructors = c1.getConstructors();
  41. for(Constructor ct : constructors) {
  42. System.out.println("构造方法的修饰: " + ct.getModifiers());
  43. System.out.println("构造方法的名称:" + ct.getName());
  44. Class[] parameterTypes = ct.getParameterTypes();
  45. System.out.print("构造方法的参数: ");
  46. for(Class cs : parameterTypes) {
  47. System.out.print(cs + " ");
  48. }
  49. System.out.println();
  50. }
  51. }
  52. }

4 Field类

4.1 基本概念

image.png

4.2 Class类的常用方法

image.png

4.3 Field类的常用方法

image.png

  1. package com.lagou.task20;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Field;
  4. /**
  5. * @author 西风月
  6. * @date 2020/8/30
  7. * @description
  8. */
  9. public class PersonFiledTest {
  10. public static void main(String[] args) throws Exception {
  11. //1. 使用原始方式获取对象并打印数值
  12. //Person p1 = new Person("张飞", 30);
  13. //System.out.println(p1.name);
  14. // 使用反射机制获取对象的成员变量数值并打印
  15. Class c1 = Class.forName("com.lagou.task20.Person");
  16. Constructor constructor = c1.getConstructor(String.class, int.class);
  17. Object o = constructor.newInstance("张飞", 30);
  18. //设置java语言访问检查的取消
  19. //Field field = c1.getField("name");
  20. Field field = c1.getDeclaredField("name");
  21. field.setAccessible(true);
  22. //获取对象Object中名字为name的成员变量的数值
  23. System.out.println("使用反射机制获取到的数值为:" + field.get(o));
  24. //3. 使用原始方式来修改成员变量数值
  25. //p1.name = "刘备";
  26. //p1.age = 35;
  27. //System.out.println(p1.name);
  28. //4. 使用反射机制修改成员变量的数值
  29. field.set(o, "关羽");
  30. System.out.println(field.get(o));
  31. //5. 获取Class对象对应类中所有的成员变量
  32. Field[] declaredFields = c1.getDeclaredFields();
  33. for(Field field1 : declaredFields) {
  34. System.out.println(field1.getModifiers());
  35. System.out.println(field1.getType());
  36. System.out.println(field1.getName());
  37. }
  38. }
  39. }

5. Method类

5.1 基本概念

image.png

5.2 Class类的常用方法

image.png

5.3 Method类的常用方法

image.png

  1. package com.lagou.task20;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Method;
  4. public class PersonMethodTest {
  5. public static void main(String[] args) throws Exception {
  6. //使用反射机制构造对象并调用方法打印结果
  7. //(1) 获取Class对象
  8. Class c1 = Class.forName("com.lagou.task20.Person");
  9. // (2) 根据Class对象来获取对应的构造方法
  10. Constructor constructor = c1.getConstructor(String.class, int.class);
  11. // (3) 构造对象
  12. Object object = constructor.newInstance("zhangsan", 29);
  13. // (4) 根据Class对象来获取对应的成员方法
  14. Method getName = c1.getMethod("getName");
  15. System.out.println("调用方法的返回值是:" + getName.invoke(object));
  16. }
  17. }

6. 获取其他结构信息

image.png