反射之操作构造方法

Constructor类概述

Constructor类概述
* 类中的每一个构造方法都是一个Constructor类的对象

通过反射获取类的构造方法

Class类中与Constructor相关的方法

  1. Constructor getConstructor(Class… parameterTypes)
    * 根据参数类型获得对应的Constructor对象。
    * 只能获得public修饰的构造方法
  2. Constructor getDeclaredConstructor(Class… parameterTypes)—推荐
    * 根据参数类型获得对应的Constructor对象
    * 可以是public、protected、(默认)、private修饰符的构造方法。
  3. Constructor[] getConstructors()
    获得类中的所有构造方法对象,只能获得public的
  4. Constructor[] getDeclaredConstructors()—推荐
    获得类中的所有构造方法对象
    可以是public、protected、(默认)、private修饰符的构造方法。

通过反射执行构造方法

Constructor对象常用方法

  1. T newInstance(Object… initargs)
    根据指定的参数创建对象
    参数:被执行的构造方法需要的实际参数
  2. void setAccessible(true)
    设置"暴力反射"——是否取消权限检查,true取消权限检查,false表示不取消

示例代码

类代码

public class Person {

    public String name;
    public int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(String name) {
        this.name = name;
    }

    private Person(int age) {
        this.age = age;	
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类代码

public class Test {
    public static void main(String[] args) throws Exception{
        /*
            Constructor getDeclaredConstructor(Class... parameterTypes)---推荐
                * 根据参数类型获得对应的Constructor对象
                * 可以是public、protected、(默认)、private修饰符的构造方法。
                * 参数: 要获取的构造方法的形参类型的Class对象
            Constructor[] getDeclaredConstructors()---推荐
                获得类中的所有构造方法对象
                可以是public、protected、(默认)、private修饰符的构造方法。

             Constructor对象常用方法
                1. T newInstance(Object... initargs)
                    根据指定的参数创建对象
                    参数:被执行的构造方法需要的实际参数
                2. void setAccessible(true)
                   设置"暴力反射"——是否取消权限检查,true取消权限检查,false表示不取消
         */
        // 获取Person类的Class对象
        Class<Person> c = Person.class;

        // 获取指定构造方法:
        // 获取第1个构造方法
        Constructor<Person> con1 = c.getDeclaredConstructor();// con1表示第一个构造方法

        // 获取第2个构造方法
        Constructor<Person> con2 = c.getDeclaredConstructor(String.class, int.class);// con2表示第二个构造方法

        // 获取第3个构造方法
        Constructor<Person> con3 = c.getDeclaredConstructor(String.class);// con3表示第三个构造方法

        // 获取第4个构造方法
        Constructor<Person> con4 = c.getDeclaredConstructor(int.class);// con4表示第四个构造方法

        System.out.println(con1);
        System.out.println(con2);
        System.out.println(con3);
        System.out.println(con4);
        System.out.println("========");

        // 获取所有的构造方法:
        Constructor<?>[] cons = c.getDeclaredConstructors();
        for (Constructor<?> con : cons) {
            System.out.println(con);
        }

        System.out.println("========");
        // 操作构造方法:
        // 通过反射执行第1个构造方法
        Person p1 = con1.newInstance();
        System.out.println("p1:"+p1);

        // 通过反射执行第2个构造方法
        Person p2 = con2.newInstance("张三", 18);
        System.out.println("p2:"+p2);

        // 通过反射执行第3个构造方法
        Person p3 = con3.newInstance("李四");
        System.out.println("p3:"+p3);

        // 通过反射执行第4个构造方法
        // 私有的构造方法想要被执行,要先取消该方法的权限检查
        con4.setAccessible(true);
        Person p4 = con4.newInstance(19);
        System.out.println("p4:"+p4);


    }
}

小结

获取类的构造方法对象:
	Constructor getDeclaredConstructor(Class... parameterTypes)
    * 根据参数类型获得对应的Constructor对象
    * 可以是publicprotected(默认)private修饰符的构造方法。

    Constructor[] getDeclaredConstructors()
    获得类中的所有构造方法对象
    可以是publicprotected(默认)private修饰符的构造方法。

Constructor对象常用方法
    1. T newInstance(Object... initargs)
     根据指定的参数创建对象
    2. void setAccessible(true)
    设置"暴力反射"——是否取消权限检查,true取消权限检查,false表示不取消
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值