Claes Redestad在core-libs-dev邮件列表上发布了消息“ RRF:8187123 :(反映)Class#getCanonicalName和Class#getSimpleName是性能问题的一部分 ”,他在邮件列表中要求审查建议的更改“以启用缓存”的另一方面,getCanonicalName和getSimpleName ,重复这已报告是一个性能瓶颈的电话。” 他补充说:“缓存将这些方法的性能提高了20倍。”
解决性能问题的一个明显解决方案可能是将类的名称作为字段添加到Class类定义中,但是Redestad在关联的错误JDK-8187123中指出:“我们应避免在java.lang中添加更多字段。班级 。” 取而代之的是,该错误的解决方法是“ 背负在ReflectionData中缓存的其他反射信息 ”。
ReflectionData
是在Class
类中定义的一个嵌套( private static
)类。 Class
类对ReflectionData
的引用定义为:
private volatile transient SoftReference<ReflectionData<T>> reflectionData;
Class
实例包含对嵌套类ReflectionData
的实例的软引用 ( java.lang.ref.SoftReference )。 用于SoftReference
的类级别的Javadoc指出,“软引用是由垃圾收集器根据内存需求自行决定清除的”,并且软引用“最常用于实现对内存敏感的缓存”。 这似乎是平衡性能和内存问题的不错的解决方案。
邮件列表消息引用了对Class.java的建议更改的链接 。 回顾这些更改,您可以快速看到建议的代码更改如何将三个新的String
添加到ReflectionData
实例中包含的属性中,以表示规范名称,简单名称和类型名称。 当然,三种方法提供向这些细节[ 另一方面,getCanonicalName() , getSimpleName() ,和getTypeName() ]被改变为使用这些值。
在撰写本文时, JDK-8187123尚未与特定的Java版本关联。
翻译自: https://www.javacodegeeks.com/2018/05/faster-repeated-access-to-java-class-names-coming-to-java.html