package tc.oc.commons.core.proxy; import java.lang.invoke.MethodHandle; import java.lang.reflect.Method; import java.util.concurrent.ExecutionException; import com.google.common.base.Throwables; import com.google.common.cache.Cache; import tc.oc.commons.core.util.CacheUtils; public abstract class CachingMethodHandleInterceptor extends MethodHandleInterceptor { private final Cache<Method, MethodHandle> cache = CacheUtils.newBuilder().build(); @Override protected MethodHandle boundMethodHandle(Method method) { try { return cache.get(method, () -> super.boundMethodHandle(method)); } catch(ExecutionException e) { throw Throwables.propagate(e); } } }