如何获取已初始化PassiveExpiringMap实例的TTL值?
获取PassiveExpiringMap的TTL值解决方案
嘿,我刚好对Apache Commons Collections里的PassiveExpiringMap比较熟悉,这个问题我来帮你搞定~
你遇到的问题是因为expirationTime这类属性是类的私有/包级私有成员,遵循面向对象的封装原则,不能直接访问。不过官方提供了公共API来间接获取TTL值,步骤如下:
步骤1:确保持有PassiveExpiringMap的具体实例引用
如果你当初声明时用了Map接口,需要先把它转回具体的PassiveExpiringMap类型(或者直接在声明时就用具体类):
// 方式1:声明时直接用具体类(推荐) PassiveExpiringMap<String, Boolean> expiringMap = new PassiveExpiringMap<>(1000); // 方式2:如果已经是Map类型,强转 Map<String, Boolean> expiringMap = new PassiveExpiringMap<>(1000); PassiveExpiringMap<String, Boolean> specificMap = (PassiveExpiringMap<String, Boolean>) expiringMap;
步骤2:获取过期策略并提取TTL值
当你用new PassiveExpiringMap<>(1000)初始化时,底层默认使用的是ConstantTimeToLiveExpirationPolicy(固定存活时间的过期策略)。我们可以通过这个策略对象拿到TTL:
// 获取过期策略 ExpirationPolicy<String, Boolean> policy = specificMap.getExpirationPolicy(); // 判断是否为固定TTL策略 if (policy instanceof ConstantTimeToLiveExpirationPolicy) { ConstantTimeToLiveExpirationPolicy<String, Boolean> ttlPolicy = (ConstantTimeToLiveExpirationPolicy<String, Boolean>) policy; long ttl = ttlPolicy.getExpirationDuration(); System.out.println("当前TTL值:" + ttl); // 这里会输出1000 }
补充说明
- 这个方法只适用于你用默认的“固定TTL”构造器初始化的场景;如果自定义了其他过期策略(比如基于最后访问时间的策略),需要对应处理该策略的API。
- 一定要通过公共API操作,不要尝试反射去访问私有属性——这会破坏封装,而且后续版本更新可能导致代码失效。
内容的提问来源于stack exchange,提问作者harshit-sh
相关产品推荐
相关产品推荐

