• 8.21Java反射访问构造方法


    8.21Java反射访问构造方法

    构造Constructor类型的对象或者数组动态获取对象构造方法的信息

    构造一个Constructor对象或者数组:

    • getConstructors()

    • getConstructor(Class<?>…parameterTypes)

    • getDeclaredConstructors()

    • getDeclaredConstructor(Class<?>...parameterTypes)

    访问指定的构造方法,需要根据该构造方法的入口参数的类型来访问。

    objectClass.getDeclaredConstructor(int.class,String.class); //入口参数类型依次为 int 和 String
    objectClass.getDeclaredConstructor(new Class[]{int.class,String.class}); //入口参数类型依次为 int 和 String

    创建的每个 Constructor 对象表示一个构造方法,然后利用 Constructor 对象的方法操作构造方法:

    方法名称说明
    isVarArgs() 查看该构造方法是否允许带可变数量的参数,如果允许,返回 true,否则返回 false
    getParameterTypes() 按照声明顺序以 Class 数组的形式获取该构造方法各个参数的类型
    getExceptionTypes() 以 Class 数组的形式获取该构造方法可能抛出的异常类型
    newInstance(Object … initargs) 通过该构造方法利用指定参数创建一个该类型的对象,如果未设置参数则表示 采用默认无参的构造方法
    setAccessiable(boolean flag) 如果该构造方法的权限为 private,默认为不允许通过反射利用 netlnstance() 方法创建对象。如果先执行该方法,并将入口参数设置为 true,则允许创建对 象
    getModifiers() 获得可以解析出该构造方法所采用修饰符的整数

    java.lang.reflect.Modifier类可以解析出getMocMers()方法的返回值所表示的修饰符信息。

    静态方法名称说明
    isStatic(int mod) 如果使用 static 修饰符修饰则返回 true,否则返回 false
    isPublic(int mod) 如果使用 public 修饰符修饰则返回 true,否则返回 false
    isProtected(int mod) 如果使用 protected 修饰符修饰则返回 true,否则返回 false
    isPrivate(int mod) 如果使用 private 修饰符修饰则返回 true,否则返回 false
    isFinal(int mod) 如果使用 final 修饰符修饰则返回 true,否则返回 false
    toString(int mod) 以字符串形式返回所有修饰符

    示例:

    int modifiers = con.getModifiers();    // 获取构造方法的修饰符整数
    boolean isPublic = Modifier.isPublic(modifiers);    // 判断修饰符整数是否为public
    string allModifiers = Modifier.toString(modifiers);

    实例:

    package PracticeReview.Reflect;

    import java.lang.reflect.Constructor;

    /**
    * 使用java.lang包下的方法去获取Practice类的信息
    * @since JDK 1.8
    * @date 2021/08/23
    * @author Lucifer
    */
    public class ReflectTest {
       public static void main(String[] args) {
           //动态获取ReflectPractice类
           Class reflectPractice = PracticeReview.Reflect.ReflectPractice.class;

           //获取类下所以的构造方法
           Constructor[] declaredContructors = reflectPractice.getDeclaredConstructors();

           //遍历所有构造方法
           for (int i=0; i<declaredContructors.length; i++){
               Constructor con = declaredContructors[i];
               // 判断构造方法的参数是否可变
               System.out.println("查看是否允许带可变数量的参数:" + con.isVarArgs());
               System.out.println("该构造方法的参数类型依次为:");

               //获取所有参数类型
               Class[] parameterType = con.getParameterTypes();
               for (int j=0; j<parameterType.length; j++){
                   System.out.println(" " + parameterType[j]);
              }

               System.out.println("可能抛出的异常类型为:");
               Class[] exceptionTypes = con.getExceptionTypes();
               for (int j = 0; j < exceptionTypes.length; j++) {
                   System.out.println(" " + exceptionTypes[j]);
              }

               // 创建一个未实例化的Book类实例
                   ReflectPractice book1 = null;
                   while (book1 == null) {
                       try { // 如果该成员变量的访问权限为private,则拋出异常
                           if (i == 1) {
                               // 通过执行带两个参数的构造方法实例化book1
                               book1 = (ReflectPractice) con.newInstance("Java 教程", 10);
                          } else if (i == 2) {
                               // 通过执行默认构造方法实例化book1
                               book1 = (ReflectPractice) con.newInstance();
                          } else {
                               // 通过执行可变数量参数的构造方法实例化book1
                               Object[] parameters = new Object[] { new String[] { "100", "200" } };
                               book1 = (ReflectPractice) con.newInstance(parameters);
                          }
                      } catch (Exception e) {
                           System.out.println("在创建对象时拋出异常,下面执行 setAccessible() 方法");
                           con.setAccessible(true); // 设置允许访问 private 成员
                      }
                  }
                   book1.print();
                   System.out.println("============================= ");
              }
          }
      }
    It's a lonely road!!!
  • 相关阅读:
    Codeforces 963E Alternating Sum 等比数列+逆元
    poj 3255 次短路
    hdu 3183 rmq+鸽巢原理
    poj 2505 乘法博弈论
    欧拉函数模板
    java中的进制转换以及字符串类和数值类的相互转化
    java 大数运算,高精度模板
    线段树模板
    [OI笔记]每周刷题记录
    HDU4388-Stone Game II-Nim变形
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15177395.html
Copyright © 2020-2023  润新知