Class.isAnnotationPresent(...) 的调用开销有多大?

4
我想知道在以下运行时环境中执行此操作可能有多昂贵:
  • JVM8
  • Dalvik
  • ART

给定类(target=TYPE)的注释信息在编译时可用,因此我猜它可以以某种方式进行缓存。但另一方面,我听说Dalvik在注释方面性能相当差。

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


你需要调用这个函数多少次,或者说有多频繁的需求? - Andrew Regan
假设它在 RecyclerView/ListView 的视图回收期间被调用。但我想知道相对来说它有多昂贵——它是像方法调用一样,还是更像通过反射创建新实例? - Zbigniew Malinowski
1个回答

3
浏览源代码,似乎isAnnotationPresent(...)调用getAnnotation(...),后者调用initAnnotationsIfNecessary()initAnnotationsIfNecessary()第一次被调用时会构造注解地图;之后的调用会重复使用之前构建好的地图。
因此,看起来第一次调用比较耗时;随后的调用则相对便宜。

好的,所以这不是编译时。我已经在Android上检查了源代码,看起来它甚至没有运行时缓存。我没有深入挖掘注释提取,但它似乎很昂贵。 - Zbigniew Malinowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接