package de.invesdwin.util.collections.loadingcache.internal; import java.lang.reflect.Field; import java.util.function.Function; import javax.annotation.concurrent.ThreadSafe; import org.apache.commons.collections.map.LRUMap; import de.invesdwin.util.lang.Reflections; @ThreadSafe public class LRUMapLoadingCache<K, V> extends ASynchronizedLoadingCache<K, V> { @SuppressWarnings("unchecked") public LRUMapLoadingCache(final Function<K, V> loadValue, final Integer maximumSize) { //apache commons LRUMap is faster than adjusted LinkedHashMap! super(loadValue, new LRUMap(maximumSize)); } public void increaseMaximumSize(final int maximumSize) { final LRUMap lru = (LRUMap) map; if (lru.maxSize() < maximumSize) { final Field field = Reflections.findField(LRUMap.class, "maxSize"); Reflections.makeAccessible(field); Reflections.setField(field, map, maximumSize); } else { throw new IllegalArgumentException( "maximumSize [" + maximumSize + "] needs to be greater than current [" + lru.maxSize() + "]"); } } }