Java 反射篇——获取构造方法

Java 反射篇——获取构造方法

1、简介

通过反射来获取一个类的构造器可以分为以下两步:

  • 获取该类的字节码对象(类对象 Class)
  • 从这个字节码对象去获取需要的构造器

2、代码实现

// 使用类对象
Class<?> myClass = Class.forName("com.zhang.reflect.Student");
// new Student()   无参构造方法
Object myObject = myClass.getDeclaredConstructor().newInstance();
// 获取有参数的构造方法
Object o = myClass.getDeclaredConstructor(String.class, String.class).newInstance("张三", "Tom");
// 获取所有的构造方法
Constructor<?>[] declaredConstructors = myClass.getDeclaredConstructors();
// 获取类的路径名字
System.out.println("类的全类名: " + myClass.getName());
System.out.println("类的简单类名: " + myClass.getSimpleName());
// 获取类对象
Class<?> myClass = Class.forName("com.zhang.reflect.Student");
// 获取所有的构造方法 ; 结果为构造方法数组
Constructor<?>[] constructors = myClass.getDeclaredConstructors();
// 迭代器获取数组里面构造方法数组里面每一个构造方法对象
for (Constructor constructor : constructors){
  System.out.println(constructor.getName()); // 构造方法的名
  System.out.println(constructor.getModifiers()); // 获取构造方法的修饰符
  System.out.println(Modifier.toString(constructor.getModifiers()));  // 人性化表达(默认为数字表达,对开发者不友好)
  // 获取构造方法所以的参数(每一个参数也是一个对象)
  Parameter[] parameters = constructor.getParameters();
  for (Parameter parameter : parameters){
    // 获取参数的名parameter.getName()[实际没有]   parameter.getType()获得参数的类型返回的是一个对象,在获取参数类型对象的名字
    // String.format() 格式化输出,第一个参数是格式化模式,后面的参数为格式化模式里面 %s(占位符)的个数
    System.out.println(String.format("\t参数: %s  %s", parameter.getType().getTypeName(),parameter.getName()));

    // 对程序来说参数名字没有意义
    // parameter.getName()相当于  int index = 0; System.out.println("arg" + index); index ++;(满足你的需要)

    // 对于一个方法来说需要获取的东西有: - 修饰符 - 方法名 - 参数的个数 - 每个参数类型(反射全部可以做到)

3、思考

myClass = Class.forName(&quot;cn.jxufe.test.Cat&quot;); 
代码A:Object myObject = myClass.getDeclaredConstructor().newInstance(); 
代码B:Object myObject = myClass.newInstance(); 
请从个人理解的角度对代码A、B的异同进行评述
  • 代码A 可以获取有参数的构造方法也可以获取无参数的构造方法
  • 代码B 默认为使用无参数的构造方法
  • 相同 : 都可以通过反射获取类对象且实例化

​ 行者不止,打之无疆

posted @ 2022-03-27 19:24  ElloeStudy  阅读(837)  评论(0编辑  收藏  举报