083.JAVA反射机制_通过反射获取和操作构造器


博主的 Github 地址


1. 获取和操作构造器

  • 获取和操作构造器分为三个步骤:
    • 首先获取目标类的字节码文件
    • 然后获取字节码对象中的目标构造器
    • 最后通过构造器创建声明实例化对象

1.1. Class 类中获取构造器的方法

1.1.1. getConstructors() 方法
  • 定义:
    public Constructor<?>[] getConstructors()
  • 作用:
    返回当前 Class 所表示类的所有 public 构造方法, 并以 Constructor 数组的形式返回.
1.1.2. getDeclaredConstructors() 方法
  • 定义:
    public Constructor<?>[] getDeclaredConstructors()
  • 作用:
    获取当前 Class 所表示类中所有的构造器, 无视访问权限进行获取.
1.1.3. getConstructor(Class<?>... parameterTypes) 方法
  • 定义:
    public Constructor<T> getConstructor(Class<?>... parameterTypes)
  • 作用:
    获取当前 Class 所表示类中指定的一个 public 构造器.
  • 参数:
    方法的参数表示构造器中所需传递的参数的 Class 类型, 例如:
    • 存在如下构造器, 构造器需要传入一个 String 类型的参数
      public User(String name){}
    • 因此可以通过如下方式去获取这个指定的构造器
      Class cls = User.class;
      Constructor c = cls.getConstructor(String.class);
1.1.4. getDeclaredConstructor(Class<?>... parameterTypes) 方法
  • 定义:
    public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
  • 作用:
    获取当前 Class 所表示类中指定的一个构造器, 无视访问权限获取任意指定构造器.

1.2. Constructor 类中操作构造器的方法

  • java.lang.reflect.Constructor<T>
1.2.1. newInstance(Object... initargs) 方法
  • 定义:
    public T newInstance(Object... initargs)

  • 作用:
    使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例.
    并用指定的初始化参数初始化该实例, 若构造器本身不需要传入参数即可声明实例,
    则参数可以不写.

  • 返回:
    通过调用此对象表示的构造方法来创建的新对象.

  • 注意:
    如果获取的目标是一个私有构造器, 获取后如果直接调用会报错,
    报错的原因是非法访问私有权限的构造器, 默认是不能访问的.
    但可以通过反射中的方法来设置访问权限为可以访问.

1.2.2. setAccessible(boolean flag) 方法
  • 定义:
    public void setAccessible(boolean flag)

  • 作用:
    将此对象的 accessible 标志设置为指示的布尔值.

    • 值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查.
    • 值为 false 则指示反射的对象应该实施 Java 语言访问检查.
1.2.3. 备注
  • Class 类中也存在 newInstance() 方法, 当一个类的构造器无参且外界可直接访问,
    则可以直接通过字节码对象调用这个方法来声明新实例.

  • AccessibleObjectConstructor, Field, Method 这三个类的父类,
    分别对应构造器, 字段和方法, 这三个反射获取类中信息的类,
    因此这三个类都有继承方法可对实例化对象进行访问权限控制.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值