Java的反射机制总结part1

核心Class类

我们来看看 正向 是怎么创建的对象,是的你没有看错,就是通过 new 这个关键字来创建对象;

	Date date = new Date();//通过new关键字实例化对象
	long time = data.getTime();//通过类的实例化对象调用类中的实例方法

向这样产生实例化的对象再一般不过了,但是我现在不想通过 new 这个关键字来产生实例话对象,我觉得不好使,那怎么办?是的,那我们反着来呗,知道类的信息,再来实例化对象,那得有个前提,知道我们要创建的对象的根源,即对象的类信息。那就要介绍一下 Class 这个类了。

	Date date = new Date();//通过new关键字实例化对象
	Class clazz = date.getClass();//获得Class类的对象,这个对象描述的是类Date的信息
	System.out.println(clazz);

输出:

class java.util.Date
Process finished with exit code 0

通过输出我们可以得到 Class 类的对象是当前实例化所在的根源类,这样就好办了,我们可以通过 Class 类的实例化对象进行对象创建:

	Date date  = new Date();
    Class clazz = date.getClass();
    try {
        Object obj = clazz.newInstance();//通过clazz对象来实例化Date类的对象
        System.out.println(obj instanceof Date);//是否是Date的实例化对象
        Date rDate = (Date) obj;// 如果是Date类的实例化对象,可以向下转型
        System.out.println(rDate.getTime());//获得long 时间
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

输出:

true
1586346109147
Process finished with exit code 0

我们可以看到输出的内容是 true ,说明该实例化的对象是Date的对象,其实这种方式是通过对象找到的 Class 类的对象,通过对象来找只是其中一种方法,下面总结3中常见的获得 Class 类的方法

三种实例化Class对象的模式

  1. Object 类的支持
    Object 类中提供了getClass() 方法来获得 Class 类的对象,在之前的例子已经说明白:

    	Person person = new Person("张三", "99.2");//年龄分数
        Class clazz = person.getClass();
        System.out.println(clazz);//前面多了一个 class
        System.out.println(clazz.getName());//包名称+类名称
        try {
            Person person1 = (Person)clazz.newInstance();//知道是Person类的对象了 Object可以转Person;
            //但是!!Person 类中没有提供无参构造 所以这个默认使用构造方法的实例化会抛出异常 这点要注意 所以一般都java类都要写无参构造方法
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    

    输出:

    class com.duanzz2.iotest.Person
    com.duanzz2.iotest.Person
    java.lang.InstantiationException: com.duanzz2.iotest.Person
    at java.lang.Class.newInstance(Class.java:427)
    at com.duanzz2.reflect.Client.main(Client.java:25)
    Caused by: java.lang.NoSuchMethodException: com.duanzz2.iotest.Person.()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.newInstance(Class.java:412)
    … 1 more

    可以从输出看到,可以通过这种 newInstance() 的方式获得实例化对象,但是,这种方法依赖的是默认的 无参构造方法,如果类没有提供 无参构造 ,那么就会抛出如上异常,找不到无参构造方法,要注意!!!
    这种方法的缺点:
    好像要实例化对象才能找到 Class 类对象


待更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值