怎样普及运用Java反射的效力?

若何普及应用Java反射的服从?

媒介

在咱们日常的事情大概口试中,都会常常碰到“反射”这个知识点,经过“反射”咱们能够动态的获得到工具的信息以及机动的挪用工具方式等,可是在利用的同时又陪伴着另一种声音的泛起,那就是“反射”很慢,要少用。岂非反射真的很慢?那跟咱们日常一般创建对象挪用办法比慢几多? 预计许多人都没去测试过,只是”道听途说“。下面咱们就直接经过一些测试用例来直观的感受一下”反射“。

正文

筹办测试工具

下面先界说一个测试的类TestUser,只有id跟name属性,以及它们的getter/setter方式,此外另有一个自定义的sayHi法子。

测试建立100万个工具

在上面这两个测试方法中,笔者各自测了5次,把他们耗损的时候取了一个平均值,在输出了局中能够看到一个是10ms,一个是926ms,在创立100W个工具的环境下,反射竟然慢了90倍阁下。wtf?差异竟然这么大?岂非反射真的这么慢?下面笔者换一种反射的姿式,持续测试一下,看看成效若何?

咦?这类操纵只须要41ms了,大大提高了反射创建对象的效力。为什么会快这么多呢?

实在经过代码咱们能够发明,是Class.forName这个办法对照耗时,它实际上挪用了一个本地办法,经过这个办法来请求JVM查找并加载指定的类。以是咱们在名目中应用的时间,能够把Class.forName返回的Class工具缓存起来,下一次运用的时分直接从缓存内里获得,如许就极大的普及了获得Class的服从。同理,在咱们获得Constructor、Method等工具的时辰也能够缓存起来运用,制止每次运用时再来泯灭时候建立。

测试反射挪用办法

这里咱们反射挪用sayHi方式1亿次,在挪用了method.setAccessible(true)后,发明快了快要一半。检察API能够领会到,jdk在配置获得字段,挪用法子的时刻会实行平安拜候查抄,而此类操纵会对比耗时,以是经过setAccessible(true)的方法能够封闭安全检查,从而晋升反射效力。

***的反射

除了上面的本领,另有没有甚么举措能够更***的应用反射呢?这里先容一个高性能反射工具包ReflectASM。它是经过字节码天生的方法来实现的反射机制,下面是一个跟java反射的机能比拟。

这里就不引见它的用法了,有爱好的朋侪能够直接传递已往:https://github.com/EsotericSoftware/reflectasm

结语

***总结一下,为了更好的应用反射,咱们该当在名目启动的时分将反射所须要的相干设置及数据加载进内存中,在运转阶段都从缓存中取这些元数据举行反射操纵。大师也不消害怕反射,虚拟机在不停的优化,只要咱们方式用的对,它并没有”风闻“中的那末慢,当咱们对机能有***谋求的时分,能够思考经过三方包,直接对字节码举行操纵。