本文我们主要来讨论一下Java反射的相关知识,主要从以下三个方面展开:
一、Java反射是什么
反射作为Java语言的一个特性,它允许开发者在程序运行阶段可以动态的获取某个类中的所有对象和方法(包括私有对象和方法),并能进行相应的操作。
二、Java反射的应用场景有哪些
Java反射机制在诸多框架中都有应用,比如友盟分享SDK中就使用反射技术动态去加载相关类,Android的注解框架ButterKnife也是利用反射方式进行优化findViewById类型的代码。
另外,我们在日常开发中,在使用第三方库时,有时想使用其私有的对象或方法,我们可以通过反射去获取并使用。
三、Java反射的缺点
虽然反射机制特别的强大,在某些情况下,能大大助力我们的日常开发,但也不能滥用,其也有如下一些缺点:
-
代码可读性低
使用反射进行编程,其代码的可读性更低,开发人员维护起来更吃力。
-
性能较低
因为反射包含一些动态类型,而JVM(可阅读:【免费】全网独家:详解JVM类加载机制)并没有对此进行优化,所以反射操作会比正常操作的效率更低。
同硬件设备情况下,循环执行100万次,耗时情况如下:
场景A:使用反射获取类实例,并调用类中的一个直接返回字符串的方法,耗时约为:13秒;
场景B:直接实例化类实例,并调用类中的一个直接返回字符串的方法,耗时约为:8秒;
很明显场景A的耗时更多,性能相对而言更低。 -
使用场景有局限
使用反射时,需确保当前环境没有安全限制,否则反射就无法正常工作了。另外我们在使用第三方库时,使用了其私有的对象或方法。然而当第三方库在新版本中删除了我们所使用的对象或方法时,稍不留神,版本兼容就会出现不可预料的问题。
总而言之,反射虽好,得看情况而定,切勿滥用。
想了解更多反射的使用细节,可阅读官方文档:Using Java Reflection。