调用Class.isAnnotationPresent(...)有多贵?

时间:2016-02-02 14:58:53

标签: java android performance reflection annotations

我想知道这个操作在以下运行时有多昂贵:

  • JVM8
  • 的Dalvik
  • ART

有关给定类(target = TYPE)的注释的信息在编译时可用,所以我猜它可以以某种方式缓存。但另一方面,我听说Dalvik在注释方面表现不佳。

如果我可以在编译期间检查和缓存信息(使用一些代码生成插件),我应该这样做,还是会过度优化?

1 个答案:

答案 0 :(得分:2)

略过source code,看起来isAnnotationPresent(...)调用getAnnotation(...),调用initAnnotationsIfNecessary()

initAnnotationsIfNecessary()在第一次调用时构造注释图;先前构造的地图将在后续调用中重复使用。

所以,从它的外观来看,第一次通话是昂贵的(-ish);随后的电话很便宜。