专栏首页技术开发——你我他反射--调用构造方法

反射--调用构造方法

调用构造方法

我们通常使用new操作符创建新的实例:

Person p = new Person();

如果通过反射来创建新的实例,可以调用Class提供的newInstance()方法:

Person p = Person.class.newInstance();

调用Class.newInstance()的局限是,它只能调用该类的public无参数构造方法。如果构造方法带有参数,或者不是public,就无法直接通过Class.newInstance()来调用。

为了调用任意的构造方法,Java的反射API提供了Constructor对象,它包含一个构造方法的所有信息,可以创建一个实例。Constructor对象和Method非常类似,不同之处仅在于它是一个构造方法,并且,调用结果总是返回实例:

public class Main {
    public static void main(String[] args) throws Exception {
        // 获取构造方法Integer(int):
        Constructor cons1 = Integer.class.getConstructor(int.class);
        // 调用构造方法:
        Integer n1 = (Integer) cons1.newInstance(123);
        System.out.println(n1);

        // 获取构造方法Integer(String)
        Constructor cons2 = Integer.class.getConstructor(String.class);
        Integer n2 = (Integer) cons2.newInstance("456");
        System.out.println(n2);
    }
}

通过Class实例获取Constructor的方法如下:

  • getConstructor(Class...):获取某个publicConstructor
  • getDeclaredConstructor(Class...):获取某个Constructor
  • getConstructors():获取所有publicConstructor
  • getDeclaredConstructors():获取所有Constructor

注意Constructor总是当前类定义的构造方法,和父类无关,因此不存在多态的问题。

调用非publicConstructor时,必须首先通过setAccessible(true)设置允许访问。setAccessible(true)可能会失败。

小结

Constructor对象封装了构造方法的所有信息;

通过Class实例的方法可以获取Constructor实例:getConstructor()getConstructors()getDeclaredConstructor()getDeclaredConstructors()

通过Constructor实例可以创建一个实例对象:newInstance(Object... parameters); 通过设置setAccessible(true)来访问非public构造方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于Sentinel Dashboard来实现流控配置

    目标:Sentinel的基本应用 工具:IDEA--2020.1、Sentinel Maven Spring Boot 学习目标:学习基于Sentinel Da...

    背雷管的小青年
  • SpringBoot集成Shiro框架

    目标:实现Spring Boot集成shiro权限认证框架 工具:IDEA--2020.1 学习目标:实现Spring Boot集成shiro权限认证框架 本次...

    背雷管的小青年
  • 作用域

    实际上,确切地说,private访问权限被限定在class的内部,而且与方法声明顺序无关。推荐把private方法放到后面,因为public方法定义了类对外提供...

    背雷管的小青年
  • 【短道速滑二】古老的基于亮度平均值的自动Gamma校正算法。

    在github上搜索代码Auto Gamma Correction,找到一个比较古老的代码,详见:https://github.com/PedramBabakh...

    用户1138785
  • 实战丨用云开发快速构建信息申报小程序

    今年迫于疫情,众多学校、公司和机构都需要统计班上同学或公司员工的健康状况、收集活动地点、健康码等信息。

    腾讯云开发TCB
  • 小程序的十万个为什么丨第一期

    A:可以使用websocket进入页面时建立连接,服务器端一旦有消息,就可以推送客户端了。然后根据服务器端相应,把信息显示出来就行了。

    极乐君
  • 7-8 堆栈模拟队列 (25 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    韩旭051
  • 小程序云开发实战七:云开发首页列表跳转详情页

    1:实战六之中,列表页已经完成,现在新建一个详情页,打开app.json,"pages/details/details",,自动生成了一个详情页

    王小婷
  • 小程序云开发实战七:云开发首页列表跳转详情页

    1:实战六之中,列表页已经完成,现在新建一个详情页,打开app.json,"pages/details/details",,自动生成了一个详情页

    王小婷
  • [重磅消息]AutoMagic自动化测试平台开源

    作者介绍: 网名: Ray 介绍:笑起来像个孩子,冷起来是个迷。 博客:http://www.cnblogs.com/tsbc/ 2018年3月29日,Ray...

    苦叶子

扫码关注云+社区

领取腾讯云代金券