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

反射--调用构造方法

调用构造方法

我们通常使用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 条评论
登录 后参与评论

相关文章

  • 用反射获取构造方法 Constructor类

    用户2965768
  • 在C++中反射调用.NET(一) 反射调用第一个.NET类的方法

    为什么要在C++中调用.NET 一般情况下,我们常常会在.NET程序中调用C/C++的程序,使用P/Invoke方式进行调用,在编写代码代码的时候,首先要导入D...

    用户1177503
  • [javaSE] 反射-方法的反射

    陶士涵
  • [javaSE] 反射-获取类的成员属性和构造方法

    陶士涵
  • Java-构造方法调用顺序

    执行结果: 开始创建一个ChildClass对象… 创建FatherClass 创建ChildClass 要点: ①关于构造方法结合继承概念的调用,有...

    Fisherman渔夫
  • 反射类的构造函数

    <!-- 首先,通过Class获取类的字节码 Class clazz = Class.forName("com.marer.reflect.Person")...

    MonroeCode
  • 如何通过反射调用对象的方法?

    唐怀瑟
  • 在OrderStatusActor构造方法中调用StartTimerAsync

    TimerCallbackAsync方法以二进制形式接收用户状态。 在示例中,回调在将状态写入日志之前将状态 string 解码回 。

    用户7108768
  • 面向Java对象和类、构造方法以及调用非构造方法

    对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个 对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。

    用户5224393
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法

    2018-09-02 06:59

    walterlv
  • 调用了tableSizeFor核心的构造方法

    put方法其实是调用了putVal方法的,调用方法的同时把计算好的key的哈希值传入,putVal方法:

    用户1503405
  • 反射调用方法,实例化对象,字段赋值

    秋白
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)

    发布于 2018-11-03 15:25 更新于 2018-12...

    walterlv
  • 反射类的方法

    关于对类的方法的反射。其中包括静态方法,普通方法,带参数的方法,以及最重要的String[]数组的方法的反射以及需要注意的细节问题,都是基础,所以请各位多多包涵...

    MonroeCode
  • 从反射链的构造看Java反序列漏洞

    概况 今天我想从构造反射链的从无到有到被利用来谈谈java的反序列化漏洞,从反射的最开始到执行payload,一个从无到有的过程,首先我们介绍一下Transfo...

    FB客服
  • 反射的用法

    在学习反射时,所有人首先面临的疑惑就是:如果程序中每个变量都是我们自己定义的,那么在编译时就可以知道变量类型了,为什么我们还需要在运行时检查变量,求出它的类型呢

    酷走天涯
  • 反射类的main方法

    有时候我们需要调用一个类的Main方法,也可说是执行这个类的代码。但是这时候这个类我们还没有写好,或者这个类是通过网络运行时传给我们的,我们就不可能在程序中知道...

    MonroeCode
  • 动态方法和反射

    .net 2.0和.net 1.x相比在反射方面加强了很多,动态方法是.net 2.0新增的内容.具体参看MSDN 如何:定义和执行动态方法  卢彦 在co...

    张善友
  • Spring Bean方法反射调用行为不一致问题分析

    实现BeanFactoryPostProcessor,在postProcessBeanFactory中,扫描所有的bean方法,将带有自定义注解EventLis...

    Dylan Liu

扫码关注云+社区

领取腾讯云代金券