15-4 反射 ---- 创建运行时类的对象 & 体会反射的动态性

本文详细介绍了Java反射中的newInstance()方法,包括如何通过反射创建运行时类的对象,要求运行时类必须有公共无参构造器。同时,文章探讨了即使没有无参构造器也能通过指定参数的构造器创建对象的步骤。此外,通过示例展示了反射的动态性,随机创建不同类的对象。
摘要由CSDN通过智能技术生成

15-4 反射 ---- 创建运行时类的对象 & 体会反射的动态性

一、newInstance():
1.调用此方法,创建对应的运行时类的对象。内部调用了运行时类的空参的构造器。
2.要想此方法正常的创建运行时类的对象,调用Class对象的newInstance()方法,要求:
(1)运行时类必须提供空参的构造器
(2)空参的构造器的访问权限得够。通常,设置为public。
3.在javabean中要求提供一个public的空参构造器。原因:
(1)便于通过反射,创建运行时类的对象
(2)便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器

二、难道没有无参的构造器就不能创建对象了吗?
不是!只要在操作的时候明确的调用类中的构造器,并将参数传递进去之后,才可以实例化操作。
步骤如下:
1)通过Class类的getDeclaredConstructor(Class … parameterTypes)取得本类的指定形参类型的构造器
2)向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数。
3)通过Constructor实例化对象。

三、
1.根据全类名获取对应的Class对象
String name = “atguigu.java.Person";
Class clazz = null;
clazz = Class.forName(name);

2.调用指定参数结构的构造器,生成Constructor的实例
Constructor con = clazz.getConstructor(String.class,Integer.class);

3.通过Constructor的实例创建对应类的对象,并初始化类属性
Person p2 = (Person) con.newInstance(“Peter”,20);
System.out.println(p2);

代码:

package java1;

import org.junit.Test;

import java.util.Random;

public class NewInstanceTest {

    //通过反射创建对应的运行时类的对象
    @Test
    public void test1() throws IllegalAccessException, InstantiationException {

        Class clazz = Person.class;

        //newInstance():调用此方法,创建对应的运行时类的对象,内部调用了运行时类的空参构造器
        Person obj = (Person) clazz.newInstance();
        System.out.println(obj);

    }


    //体会反射的动态性
    @Test
    public void test2(){

        for(int i = 0;i < 10;i++){
            int num = new Random().nextInt(3);//0,1,2
            String classPath = "";
            switch(num){
                case 0:
                    classPath = "java.util.Date";
                    break;
                case 1:
                    classPath = "java.lang.Object";
                    break;
                case 2:
                    classPath = "java1.Person";
                    break;
            }

            try {
                Object obj = getInstance(classPath);
                System.out.println(obj);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }



    }

        //创建一个指定类的对象。classPath:指定类的全类名
        public Object getInstance (String classPath) throws Exception {
            Class clazz = Class.forName(classPath);
            return clazz.newInstance();
        }

}

test1输出:

Person()
Person{name='null', age=0}

test2输出:

Person()
Person{name='null', age=0}
Person()
Person{name='null', age=0}
Person()
Person{name='null', age=0}
Person()
Person{name='null', age=0}
Wed Feb 24 15:36:21 CST 2021
Wed Feb 24 15:36:21 CST 2021
java.lang.Object@5d6f64b1
Person()
Person{name='null', age=0}
Wed Feb 24 15:36:21 CST 2021
Wed Feb 24 15:36:21 CST 2021
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YY鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值