110.反射之构造方法简介;通过Class类对象获取构造方法

反射之构造方法简介

构造方法在调用的过程中首先会受到权限修饰符的约束,如果是public,类外也可以通过构造方法创建对应的类对象,如果是私有化的构造方法,只能在类内的方法中调用该构造方法,但是构造方法选择和【参数】有直接关系,而构造方法的名字是固定的,就是当前的类名;构造方法是依赖,参数类型区分的;根据参数的类型,个数,顺序来选择执行对应的构造方法;

通过Class类对象获取构造方法

<1>Constructor[] getConstrucctors(); 获取当前Class类对象内所有的非私有化构造方法类对象数组;

<2>Constructor[] getDeclaredConstructors(); 获取当前Class类对象内所有的构造方法类对象数组,包括私有化构造方法,【暴力反射】【私有化的也能获取】

<3>Constructor getConstructor(Class… initParametertypes);【重点】获取指定参数数据类型,顺序,个数的非私有化构造方法

例如:

[1]public Person(int id,String name){} Class类对象 .getConstructor(int.class,String.class);
int.class,String.class 这里需要的构造方法参数类型是(int,String)

[2]Public Person(int id){} Class类对象.getConstructor(int.class);

[3]public Person(){} Class类对象.getConstructor();

①这里需要的参数类型是Class类对象,用于约束当前方法所需的数据类型;
②…是不定长参数,参数个数不限制;

<4>Constructor getDeclaredConstructor(Class… initParameterTypes);获取指定参数类型,顺序,个数对应的构造方法,可以获取私有化构造方法Constructor对象【暴力反射】

例如:private Person(String name); Class类对象 .getDeclaredConstructor(String.class);

class Panda{
    public static void main(String[] args) throws NoSuchMethodException {
        //首先创建Class类对象
        Class classTest = Test.class;
        //通过Class类对象获取Test类的构造方法
        //获取Class类对象内所有的非私有化构造方法类对象数组
        Constructor[] constructors = classTest.getConstructors();
        //获取Class类对象内所有的构造方法类对象数组【包括私有化】【暴力反射】
        Constructor[] constructors1 = classTest.getDeclaredConstructors();
        //获取Class类对象指定参数类型,顺序,个数的非私有化构造方法Constructor类对象
        //获取Test类的有三个参数的构造方法,传入参数应该是String.class,Integer.class,String.class
        Constructor constructor = classTest.getConstructor(String.class,Integer.class,String.class);
        //获取Test类没有参数的构造方法
        Constructor constructor1 = classTest.getConstructor();
        //获取Class类对象内任意指定类型的构造方法,包括【私有化构造方法】【暴力反射】
        Constructor constructor2 = classTest.getDeclaredConstructor(String.class,Integer.class);
    }
}

@Data
public class Test{
    //成员变量
    private String name;
    private Integer age;
    private String sex;

    //无参构造方法
    public Test(){}
    //有参构造方法
    public Test(String name,Integer age,String sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    private Test(String name, Integer age){
        this.name = name;
        this.age = age;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值