有了这个构造器对象,我们就可以在代码中灵活的创建对象了
image.png

getDeclaredConstructor() 拿到存在的构造器:

image.png
image.png
获取了构造器,现在创建对象
image.png

  1. package com.itheima.d3_reflect_constructor;
  2. import org.junit.Test;
  3. import java.lang.reflect.Constructor;
  4. /**
  5. 目标:反射_获取Constructor构造器对象.
  6. 反射的第一步是先得到Class类对象。(Class文件)
  7. 反射中Class类型获取构造器提供了很多的API:
  8. 1. Constructor getConstructor(Class... parameterTypes)
  9. 根据参数匹配获取某个构造器,只能拿public修饰的构造器,几乎不用!
  10. 2. Constructor getDeclaredConstructor(Class... parameterTypes)
  11. 根据参数匹配获取某个构造器,只要申明就可以定位,不关心权限修饰符,建议使用!
  12. 3. Constructor[] getConstructors()
  13. 获取所有的构造器,只能拿public修饰的构造器。几乎不用!!太弱了!
  14. 4. Constructor[] getDeclaredConstructors()
  15. 获取所有申明的构造器,只要你写我就能拿到,无所谓权限。建议使用!!
  16. 小结:
  17. 获取类的全部构造器对象: Constructor[] getDeclaredConstructors()
  18. -- 获取所有申明的构造器,只要你写我就能拿到,无所谓权限。建议使用!!
  19. 获取类的某个构造器对象:Constructor getDeclaredConstructor(Class... parameterTypes)
  20. -- 根据参数匹配获取某个构造器,只要申明就可以定位,不关心权限修饰符,建议使用!
  21. */
  22. public class TestStudent01 {
  23. // 1. getConstructors:
  24. // 获取全部的构造器:只能获取public修饰的构造器。
  25. // Constructor[] getConstructors()
  26. @Test
  27. public void getConstructors() { // 定义一个测试方法
  28. // a. 第一步: 获取类对象
  29. Class c = Student.class;
  30. // b. 提取类中的全部的构造器对象 // 返回的是一个构造器类型的数组
  31. Constructor[] constructors = c.getConstructors(); //
  32. // c. 遍历构造器 // 将构造器数组,遍历.for
  33. for (Constructor constructor : constructors) { // 一个参数是0 一个参数的数量为2
  34. System.out.println(constructor.getName() + "====>" + constructor.getParameterCount());
  35. }
  36. }
  37. // 2. getDeclaredConstructors();
  38. // 获取所有的构造器,只要你敢写,这里就能拿到,无所谓权限是否可及(可以拿到private的)
  39. @Test
  40. public void getDeclaredConstructors() { // 定义一个测试方法
  41. // a. 第一步: 获取类对象
  42. Class c = Student.class;
  43. // b. 提取类中的全部的构造器对象 // 返回的是一个构造器类型的数组
  44. Constructor[] constructors = c.getDeclaredConstructors(); //
  45. // c. 遍历构造器 // 将构造器数组,遍历.for
  46. for (Constructor constructor : constructors) { //一个参数是0 参数的数量为2
  47. System.out.println(constructor.getName() + "====>" + constructor.getParameterCount());
  48. }
  49. }
  50. /**
  51. * getConstructor (Class .. parameterTypes)
  52. * 获取某个构造器: 只能拿public修饰的某个构造器
  53. */
  54. @Test
  55. public void getConstructor() throws NoSuchMethodException { // 定义一个测试方法
  56. // a. 第一步: 获取类对象
  57. Class c = Student.class;
  58. // b. 定位单个构造器对象(按照参数定位无参数构造器)
  59. Constructor constructor = c.getConstructor(); // 只能拿public的构造器,这里没有写参数,所以拿到的是无参构造器
  60. System.out.println(constructor.getName() + "====>" + constructor.getParameterCount());
  61. }
  62. // 4.getConstructor(Class... parameterTypes)
  63. // 获取某个构造器:只要你敢写,这里就能拿到,无所谓权限是否可及。
  64. @Test
  65. public void getDeclaredConstructor() throws Exception {
  66. // a.第一步:获取类对象
  67. Class c = Student.class;
  68. // b.定位单个构造器对象 (按照参数定位无参数构造器)
  69. Constructor cons = c.getDeclaredConstructor();
  70. System.out.println(cons.getName() + "===>" + cons.getParameterCount());
  71. // c.定位某个有参构造器 // 这里匹配的是String类型的类型
  72. Constructor cons1 = c.getDeclaredConstructor(String.class, int.class);
  73. System.out.println(cons1.getName() + "===>" + cons1.getParameterCount());
  74. }
  75. }
  1. package com.itheima.d3_reflect_constructor;
  2. import org.junit.Test;
  3. import java.lang.reflect.Constructor;
  4. /**
  5. 目标: 反射_获取Constructor构造器然后通过这个构造器初始化对象。
  6. 反射获取Class中的构造器对象Constructor作用:
  7. 也是初始化并得到类的一个对象返回。
  8. Constructor的API:
  9. 1. T newInstance(Object... initargs)
  10. 创建对象,注入构造器需要的数据。
  11. 2. void setAccessible(true)
  12. 修改访问权限,true代表暴力攻破权限,false表示保留不可访问权限(暴力反射)
  13. 小结:
  14. 可以通过定位类的构造器对象。
  15. 如果构造器对象没有访问权限可以通过:void setAccessible(true)打开权限
  16. 构造器可以通过T newInstance(Object... initargs)调用自己,传入参数!
  17. */
  18. public class TestStudent02 {
  19. // 1.调用构造器得到一个类的对象返回。
  20. @Test
  21. public void getDeclaredConstructor() throws Exception {
  22. // a.第一步:获取类对象
  23. Class c = Student.class;
  24. // b.定位单个构造器对象 (按照参数定位无参数构造器)
  25. Constructor cons = c.getDeclaredConstructor();
  26. System.out.println(cons.getName() + "===>" + cons.getParameterCount());
  27. // 如果遇到了私有的构造器,可以暴力反射 (只能暴力一次,下次就不行了,破坏了封装性)
  28. cons.setAccessible(true); // 权限被打开
  29. Student s = (Student) cons.newInstance(); // cons是构造器类型的对象(这里获取的是无参构造器对象),现在根据这个指定的构造器创建Student类型的对象
  30. System.out.println(s); // 输出 无参数构造器执行!Student{name='null', age=0}(执行了构造器里面的内容)
  31. System.out.println("-------------------");
  32. // c.定位某个有参构造器
  33. Constructor cons1 = c.getDeclaredConstructor(String.class, int.class);
  34. System.out.println(cons1.getName() + "===>" + cons1.getParameterCount());
  35. Student s1 = (Student) cons1.newInstance("孙悟空", 1000); // 将Student有参构造器,创建Student对象,给予参数
  36. System.out.println(s1); //有参数构造器执行!
  37. // Student{name='孙悟空', age=1000}
  38. }
  39. }
  1. package com.itheima.d3_reflect_constructor;
  2. public class Student {
  3. private String name;
  4. private int age;
  5. private Student(){
  6. System.out.println("无参数构造器执行!");
  7. }
  8. public Student(String name, int age) {
  9. System.out.println("有参数构造器执行!");
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public int getAge() {
  20. return age;
  21. }
  22. public void setAge(int age) {
  23. this.age = age;
  24. }
  25. @Override
  26. public String toString() {
  27. return "Student{" +
  28. "name='" + name + '\'' +
  29. ", age=" + age +
  30. '}';
  31. }
  32. }