使用反射机制调用构造函数

先来观察一个类,如下:

package com.andy.entity;

public class Cat {

        private int age;//定义猫的年龄
        private double weight;//定义猫的体重

        public Cat(int age,double weight)
        {
            this.age=age;
            this.weight=weight;
        }

        public Cat() {
           System.out.println("-----这是无参构造函数-----------");
        }
        @Override
        public String toString() {      
            return "猫的年龄是"+age+"  体重是"+weight;
        }

}

这是一个普通的java类,需要注意的是该类具有无参构造函数,那么怎么通过反射来获取该类的实例呢?
代码如下:
package com.andy.temp;

public class Temp {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

    Class<?>class1=Class.forName("com.andy.entity.Cat");
    try {

        System.out.println(class1);//输出“class com.andy.temp.Cat”
        Object  cat=class1.newInstance();
        System.out.println(cat);//调用toString方法
    } catch (Exception e) {

        e.printStackTrace();
    }

}

}
该程序执行后会输出以下信息:
class com.andy.entity.Cat
—–这是无参构造函数———–
猫的年龄是0 体重是0.0

之所以实例的属性值都是默认值,是因为我们这里调用的是默认构造函数。如果需要调用有参构造函数,那么就需要通过反射机制API获取有参构造函数。
在Class类中,提供了两个和获取构造函数相关的函数,
一是public Constructor<?>[] getConstructors() 该函数用来获得所有的构造函数。
二是public Constructor<T> getConstructor(Class<?>... parameterTypes) 该函数根据参数调用相应的构造函数。
此时保持Cat类不变,将Temp类修改如下:

package com.andy.temp;

import java.lang.reflect.Constructor;

public class Temp {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        Class<?>class1=Class.forName("com.andy.entity.Cat");
        try {
            Constructor<?> constructor=class1.getConstructor(int.class,double.class);
            Object cat=constructor.newInstance(2,2.6);//相当于正常情况下的new,会调用构造函数
            System.out.println(class1);//输出“class com.andy.temp.Cat”
            System.out.println(cat);//调用toString方法
        } catch (Exception e) {

            e.printStackTrace();
        }


    }

}

输出结果如下:
class com.andy.entity.Cat
猫的年龄是2 体重是2.6

建议:在编写类时,要保留无参构造函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值