⑴ 怎么理解java中的反射,作用是什么
反射是审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等.
反射的主要作用是用来扩展系统和动态调用程序集。
所谓扩展系统就是先把系统写好,系统里面定义接口,后面开发的人去写接口的代码。
此时该系统就要用反射了,系统用反射调用接口,当接口没写,系统利用反射就不会不会出错,此时就等于没实现此功能而已,当接口被人写好了,系统就会自动调用接口的功能展现在系统上。
即反射实现即插即用功能。
动态调用程序集就是利用反射去调用编译好的dll,当然此时的dll没有被引用到你所建的工程里面。
当你编译你的工程时,不会编译你调用的dll,当你运行到调用dll时,此时才会去调用dll,判断是否有语法语义,等编译,运行的错误。
这样利用反射具有一定灵活性,就是不用从你的工程调用dll,还有就是dll可随时改变(当然接口还是要对应),不需改变你所建的工程。
总之反射最好的好处就是新建工程时后不须一定要写好dll,可新建完工程后,后期写dll也可以。即所谓后期绑定。当然利用反射是耗资源的,损失效率,如果不是在上面的场合利用此技术,可能不会带来好处,反而是坏处。
⑵ java反射的性能为什么低
java反射需要将内存中的对象进行解析,涉及到与底层c语言的交互,速度会比较慢。
java反射得到的每一个Method都有一个root,不暴漏给外部,而是每次一个Method。具体的反射调用逻辑是委托给MethodAccessor的,而accessor对象会在第一次invoke的时候才创建,是一种lazy init方式。而且默认Class类会cache method对象。目前MethodAccessor的实现有两种,通过设置inflation,一个native方式,一种生成java bytecode方式。native方式启动快,但运行时间长了不如java方式,个人感觉应该是java方式运行长了,jit compiler可以进行优化。所以JDK6的实现,在native方式中,有一个计数器,当调用次数达到阀值,就会转为使用java方式。默认值是15。java方式的实现,基本和非反射方式相同。
⑶ java反射究竟消耗多少效率
首先明确概念
String str = new String();
上面的String称为‘类’,str指向的目标称为‘实体’。到此无法理解的话,请温习java面向对象的基础后再往下阅读。
反射实现的核心是Class类。运行时,每一个类都对应一个Class实体,利用这些实体完成反射行为。这些实体是在jvm进行类加载时完成创建的,不论是否有反射操作,所以和反射的开销无关。
反射机制是对人来说的一种逻辑特征,对计算机来说,和普通的方法调用没有任何区别,所以在编译阶段的开销差距不大,可能会更小(因为引包更少)。
java是强类型语言,反射能够在使用上弱化这种‘强’。正常的实体创建和方法调用,是通过地址直接调用的,而反射是通过字符串的匹配来寻址,再按地址调用,中间多出一步寻址。寻址的开销在执行实体内部方法以及静态方法时和Map类的键值对寻址开销相同,基本可以忽略。构造方法稍微复杂一点,但差距也不大。
综上,就本人考虑到的内容,反射相比直接调用,只增加了简单几步寻址过程,不会对效率造成太大影响。
⑷ java面试题:如何提高反射效率
1、在系统启动阶段使用反射。
2、将反射得到元数据保存起来,使用时,只需从内存中调用即可。
3、hotspot虚拟机会对执行次数较多的方法进行优化(例如使用jit技术)。
4、使用高性能的反射库,应该会比自己写缓存效果好。
⑸ java 中 clazz.newInstance 和 supplier.get() 哪个效率更高
1、newInstance是弱类型、低效率的代表。
2、supplier是1.8提供的函数式接口,惰性执行(即用之前才会真的new),只是延迟了new的时间而已,但仍然是直接new(而不是反射)
3、所以supplier的效率高