阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

调用构造方法

63次阅读
没有评论

共计 1312 个字符,预计需要花费 4 分钟才能阅读完成。

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

Person p = new Person();

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

Person p = Person.class.newInstance();

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

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

import java.lang.reflect.Constructor;

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 构造方法。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计1312字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中