反射机制概念及自我复盘

在聊反射之前,我们先明确反射的概念是什么:反射是一个让我们可以通过类对象获取该类众多属性的机制。
如果将反射形象地比作类照镜子,那么反射不光是镜,还是面透视镜。

正常方式:引入需要“包装”的类——通过new实例化——获得该类的实例化对象。

反射则与之恰恰相反。

反射方式:通过该类的实例化对象——getClass()方法——获得该类的完整“包装”名称。

这一不走寻常路的方式有什么强大的过人之处呢?接下来就侃侃它能做什么。

  • Java作为一门面向对象的静态语言,是不会存在动态性编程的,而通过利用反射这一机制,便可让Java具备动态性,可以称之为“半动态语言”。
  • 反射是让Java成为动态语言的根本
  • 通过它,我们可以获取该类的几乎所有信息:该类的属性、方法、构造器、实现了哪些接口,甚至于它所包含的注解和它的泛型。

反射机制很强大,它被许多框架所利用,众多框架的底层就是它,因此非常非常非常重要。
这样强大到不讲道理的机制,难道就是万能的吗?非也。

它也有缺点,那就是:运行速度较直接调用稍慢。
(做过一个小测试,10亿次为限,直接调用对象比利用反射调用对象快了约480倍,同时,若在调用对象时关闭该对象的检查机制可稍稍加快此调用过程。)
瑕不掩瑜,这一小瑕疵并不能遮蔽了它的强大,因此学好它非常重要。

这里可能就有人会好奇了,它凭什么如此不讲道理呢?此处涉及到类加载的过程,详见上篇~当然!这里也有所补充。

在类加载完成之后,JVM将会在堆内存的方法区中创建一个仅代表该类的完整的构造信息,因此我们可以通过该对象的构造信息获取其众多属性。
对于每个类而言,JRM都会创建一个独属于它的不变的Class对象,所以每个Class对象都包含了特定的某个结构。

注意!

Class本身也是一个类(java.lang.Class)。

Class对象仅能通过JVM创建,不可手动建立,只能获取。

一个类在内存中有且仅有一个Class对象。

一个加载的类在JVM中仅有一个Class实例,被加载后,类的整个结构都将会被封存在Class对象中。

Class是反射的根源,针对任何你想动态加载、运行的类,首先都必须要获取它的Class对象,之后才能进行相应的操作。

正所谓条条大路通罗马,获取Class对象的方式同样也有多种:

  • 使用 数据类型.class() 获取其对象【此方法最为可靠,系统安全性极高】

  • Class.forName() 获取其对象

  • 引用/对象.getclass() 获取其对象【此方法可能抛出ClassNotFoundException,切记切记】

  • 使用 包装类.TYPE 的方式获取基本数据类型的对象

  • 调用Class对象的 newInstance() 方法来将其实例化
    (此方法要求:类必须要有一个无参构造器、类的构造器访问权限要足够。已过时,不推荐使用)

    此篇仅是对于反射机制发表一下自己的理解和做一个自我的小总结,具体属性的调用方法太多啦——实在不会…API yyds!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值